IT系メモ

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

既存のファイルからの読み込みが未完成

#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);

  /******文章入力*******/
  printf("Input 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")){  //保存して継続
      
      LineP = TopP;

      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);
      
      continue;
    }
    else if(!strcmp(LineP->textline, "SaveAs")){//新たなファイル名で保存
      /******ファイル名の入力*******/
      printf("Input a File new name : ");
      gets(fname);
      strcat(fname, exten);

      break;
    }
    else if(!strcmp(LineP->textline, "IMPORT")){//既存のファイルを読み込み追加
      FILE *fp2;
      int i;
      char fname2[10];
      
      do{
	printf("Import File name : ");
	gets(fname2);
	
	if((fp2 = fopen(fname2,"r")) == NULL){
	  printf("NO file name of '%s'\n",fname2);
	}
      }while(fp2 == NULL);
      
      for(i=0;feof(fp)==0;i++){
	fscanf(fp2, "%s", LineP->textline);
	
	LineP->NextP = NULL;  //一行入力した次のポインタをNULLに
	
	if (PrevP){  //はじめて入力したとき
	  PrevP->NextP = LineP; //直前位置を示すPrevPに一行目のポインタを入れる
	}else TopP = LineP;  //はじめての入力でないとき
	
	PrevP = LineP; //直前の位置を保存
      }

      fclose(fp2);
    }
    else if(!strcmp(LineP->textline, "QUIT")) exit(1); //強制終了

    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("Fined same name file. Over write? 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("Tuika? 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("Do you save new file name? 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);
	      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;
}