IT系メモ

興味のあったことや、勉強したことなどをメモしていきます。

電子部品の購入を大学生協で

http://www.itmedia.co.jp/news/articles/0601/17/news047.html
期待大!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NN 100

struct Textdata{
  char textline[NN];   //一行文の文字数
  struct Textdata* NextP;   //次のデータ構造へのポインタ
};

int main(void)
{
  FILE *fp;
  char fname[10],exten[5]=".txt";
  struct Textdata* TopP;   //トップ位置
  struct Textdata* LineP;   //一行のはじめ
  struct Textdata* PrevP = NULL; //直前位置
  

  /******ファイル名の入力*******/
  printf("Input a File name : ");
  gets(fname);
  strcat(fname, exten);

  if((fp = fopen(fname,"r")) != NULL){  //既存のファイルが存在するとき
    while(-1){
      LineP = malloc(sizeof(struct Textdata));
      if (!LineP){
	printf("Momory allocation error!");
	exit(1);
      }
      fgets(LineP->textline,NN,fp);
      int len;
      len=strlen(LineP->textline);
      LineP->textline[len-1]='?0';
      if(feof(fp)!=0){
	free(LineP);
	break;
      }
      
      LineP->NextP = NULL;  //一行入力した次のポインタをNULLに
      
      if (PrevP){  //はじめて入力したとき
	PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる
      }else TopP = LineP;  //はじめての入力でないとき
      
      PrevP = LineP; //直前の位置を保存
    }
    
    LineP = TopP;

    while(LineP){
      printf("%s", LineP->textline);
      LineP = LineP->NextP;
    }
    fclose(fp);
  }

  /******文章入力*******/
  printf("?nInput text! :?n");
  while (-1){   //無限ループ
    LineP = malloc(sizeof(struct Textdata));   //一行文を確保
    if (!LineP){
      printf("Momory allocation error!");
      exit(1);
    }
    
    gets (LineP->textline);
    
    if (!strcmp(LineP->textline, "SaveQ")){ //SaveQを入力すると一行文のメモリを解放
      free(LineP);
      break;    //whileの無限ループから抜ける
    }
    else if(!strcmp(LineP->textline, "SAVE")){  //保存して継続
      //free(LineP); 
      LineP = TopP;
      
      if((fp = fopen(fname,"w")) == NULL){
	printf("%s.txt Open Error!",fname);
	free(fname);
	exit(1);
      }
      while(LineP){
	fprintf(fp,"%s?n", LineP->textline);
	LineP = LineP->NextP;
      }
      fclose(fp);
      
      continue;
    }
    else if(!strcmp(LineP->textline, "SaveAs")){//新たなファイル名で保存
      free(LineP);
      /******ファイル名の入力*******/
      printf("Input a File new name : ");
      gets(fname);
      strcat(fname, exten);
      
      LineP = TopP;
      
      if((fp = fopen(fname,"w")) == NULL){
	printf("%s.txt Open Error!",fname);
	free(fname);
	exit(1);
      }
      while(LineP){
	fprintf(fp,"%s?n", LineP->textline);
	LineP = LineP->NextP;
      }
      fclose(fp);
      
      continue;
    }
    else if(!strcmp(LineP->textline, "IMPORT")){//既存のファイルを読み込み追加
      free(LineP);
      
      FILE *fp2;
      char fname2[10];
      
      do{
	printf("Import File name : ");
	gets(fname2);
	
	if((fp2 = fopen(fname2,"r")) == NULL){
	  printf("'%s'を見付けられません?n",fname2);
	}
      }while(fp2 == NULL);
      
      while(-1){
	LineP = malloc(sizeof(struct Textdata));
	if (!LineP){
	  printf("Momory allocation error!");
	  exit(1);
	}
	fgets(LineP->textline,NN,fp2);
	int len;
	len=strlen(LineP->textline);
	LineP->textline[len-1]='?0';
	if(feof(fp2)!=0){
	  LineP->NextP = NULL;
	  free(LineP);
	  break;
	}
	
	LineP->NextP = NULL;  //一行入力した次のポインタをNULLに
	
	if (PrevP){  //はじめて入力したとき
	  PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる
	}else TopP = LineP;  //はじめての入力でないとき
	
	PrevP = LineP; //直前の位置を保存
      }
      
      fclose(fp2);
      continue;
    }
    else if(!strcmp(LineP->textline, "QUIT")) exit(1); //強制終了
    else if(!strcmp(LineP->textline, "SEARCH")){ //検索
      char buff[20];
      int Le,Ch=0,len,i,j,m=0;
      
      printf("Target: ");
      gets(buff);
      len = strlen(LineP->textline); //文字数カウント
      LineP->textline[len-1]='?0';

      LineP = TopP;
      
      while(LineP){
	Le=1;
	for(i=0,j=0; i<=len; i++){
	  printf("a%d?n",i);
	  if(LineP->textline[i] == buff[j]){ //一文字目が見付かる
	    Ch=i+1; //文字列番号を保存
	    printf("bbbbbbb?n");
	    for(;LineP->textline[i]==buff[j] || j>=strlen(buff);i++,j++){ //残りの文字を比較
	      printf("cccc%d?n",j);
	      if(j==strlen(buff)-1){ //全てが同じだったら
		m++;
		printf("%d:L%d,C%d?n",m,Le,Ch);
		break;
	      }
	    } //残りの文字比較
	    if(j>strlen(buff)) printf("Not found11,i=%d,j=%d?n",i,j);
	  }//1文字目が見付かる
	  else if(len<i) printf("Not found22,i=%d,j=%d?n",i,j);
	}//一つの行について比較
	Le++;
	LineP = LineP->NextP; //次の行にいく
      }   
    }
      

    LineP->NextP = NULL;  //一行入力した次のポインタをNULLに
    
    if (PrevP){  //はじめて入力したとき
      PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる
    }else TopP = LineP;  //はじめての入力でないとき
    
    PrevP = LineP; //直前の位置を保存
  } //while無限ループ終了


  LineP = TopP;

  
  /********ファイルの保存***********/
  if((fp = fopen(fname, "r")) != NULL){  //同一名のファイルがあったとき
    char slct[10];
    while(-1){
      printf("同じ名前のファイルが既にあります。上書きしますか?  y/n :");
      gets(slct);
      if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break;
    }
    if(!strcmp(slct,"y")){  //上書き保存
      if((fp = fopen(fname,"w")) == NULL){
	printf("%s.txt Open Error!",fname);
	exit(1);
      }
      while(LineP){
	fprintf(fp,"%s?n", LineP->textline);
	LineP = LineP->NextP;
      }
      fclose(fp);
    }
    else if(!strcmp(slct,"n")){  //上書き保存しない
      while(-1){
	printf("追加書き込みしますか? y/n :");
	gets(slct);
	if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break;
      }
	if(!strcmp(slct,"y")){
	if((fp = fopen(fname,"a")) == NULL){ //追加書き込み
	  printf("%s.txt Open Error!",fname);
	  exit(1);
	}
	while(LineP){
	  fprintf(fp,"%s?n", LineP->textline);
	  LineP = LineP->NextP;
	}
	fclose(fp);
	}
	else if(!strcmp(slct,"n")){ //追加書き込みをしない
	  while(-1){
	    printf("新しい名前で保存しますか?  y/n :");
	    gets(slct);
	    if(strcmp(slct,"y")==0 || strcmp(slct,"n")==0)break;
	  }
	  if(!strcmp(slct,"y")){  //新しい名前で保存
	    printf("Input a File new name : ");
	    gets(fname);
	    strcat(fname, exten);
	    
	    if((fp = fopen(fname,"w")) == NULL){
	      printf("%s.txt Open Error!",fname);
	      free(fname);
	      exit(1);
	    }
	    while(LineP){
	      fprintf(fp,"%s?n", LineP->textline);
	      LineP = LineP->NextP;
	    }
	    fclose(fp);
	    }
	  else if(!strcmp(slct,"n")){ //上書き保存せず、追加書き込みをせず、新しい名前で保存しないとき
	    printf("Not save.");
	  }
	}//新しい名前
    }//追加書き込み
  }//上書き

  else {  //同一ファイル名がないとき、通常保存
    if((fp = fopen(fname,"w")) == NULL){
      printf("%s.txt Open Error!",fname);
      exit(1);
    }
    while(LineP){
      fprintf(fp,"%s?n", LineP->textline);
      LineP = LineP->NextP;
    }
    fclose(fp);
  }
  
  /********メモリの解放*********/
  LineP = TopP;
  while(LineP){
    free(LineP);
    LineP = LineP->NextP;
  }

  return 0;
}