1

データを読み込んで保存したいプログラムがあります。理想的には、データを読み取り、データを表示して変更し、必要に応じて別のファイルに保存できるようにしたいと考えています。現在、データを読み取ることができる場所にありますが、変更を加えたり、コンテンツを別のファイルに保存したりすることはできません。かなり長いので、コード全体を投稿することは避けますが、ここに私の構造、メイン関数、メニュー関数、および読み取り関数を示します。

typedef struct friends_contact{

  char *First_Name;
  char *Last_Name;
  char *home;
  char *cell;
}fr;


int main() {

  fr friends[5];
  char buffer[BUFFSIZE];
  int counter=0;
  int i=0;

  menu(friends, &counter,i,buffer);

  getch();
  return 0;
}
//Menu function
void menu(fr*friends,int* counter, int i,char buffer[]) {
  int user_entry=0;
  int user_entry1=0;
  int user_entry2=0;
  char user_entry3[50]={'\0'};
  FILE *read;
  printf("Welcome! Would you like to import a file? (1)Yes or (2) No");
  scanf("%d",&user_entry1);
  if(user_entry1==1)
     {
      printf("Please enter a file name");
      scanf("%s",user_entry3); 
      read=fopen(user_entry3,"r");
     }else;
  do{
     int result;

     printf("\nPhone Book Application\n");
     printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit\n");   
     scanf("%d", &user_entry);


    if(user_entry==1)
      {
       add_contact(friends,counter,i,buffer);
      }
    if(user_entry==2)
      {
       delete_contact(friends ,counter,i);
      } 
    if(user_entry==3)
      {
      result=show_contact(friends ,counter,i);
      if(result==0)
        {
         printf("\nName not Found\n");
        }else
              result;

      }                  
     if(user_entry==4)
       {
        print_contact(friends, counter,i,user_entry3);
        if(user_entry1==1){
        file2(friends ,counter,i,buffer,read);

       }else;
  } 

}while(user_entry!=5);
 if(user_entry==5)
   {
    fclose(read);
    printf("Would you like to save entries to a file? (1)yes or (2) no");
    scanf("%d",&user_entry2);
     if(user_entry2 == 1)
       { 
        printf("Please name your file");
        scanf("%s",user_entry3); 
        file(friends, counter,i,user_entry3);
        printf("Goodbye!"); 
       }else if(user_entry2 == 2)
         {
          printf("Goodbye!"); 
         }
      }

 }

私の読み取り機能:

char file2(fr*friends ,int* counter, int i,char buffer[],FILE*read){
   fseek(read, 0, SEEK_SET); 

   while (fscanf(read, "%s", buffer) != EOF) 
    {
       friends[i].First_Name=malloc(BUFFSIZE*strlen(buffer));
       strcpy(friends[i].First_Name, buffer);
       printf("%s\n",friends[i].First_Name);

    }


}

先ほど言ったように、現在、ファイルの内容を表示することはできますが、編集したり、別のファイルに出力したりすることはできません。私のコードにはおそらく完璧ではないものもありますが、他の変更を行うことを心配する前に、これに集中しようとしています(プログラムは言及された問題の外で動作するため)。大きな緑色のチェックマークを出す準備ができました! :)

4

1 に答える 1

0

アプリケーションで文字列を編集する場合は、必要に応じてバッファを拡張する必要があることに注意してください。固定長のレコードを使用する (そして文字列にゼロを埋め込む) 方が合理的かもしれません。次に、バッファの最後を超えてオーバーフローしていないことを確認し、使用fread()して、ファイルとの間で構造を一度fwrite()に読み取り/ダンプしfrます (基本的に読み取り/書き込みsizeof(fr)- エンディアンが異なるマシンでアプリケーションを実行しない限り、安全です) )。

とはいえ、いくつかの観察:

  • switchmultiple の代わりに使用if(user_entry==x)し、その部分で何かを行いますelse(印刷警告など)-通常、コード内の通常の分岐またはエラー分岐のいずれかを通知します。
  • width infscanf(read, "%s", buffer)を使用して、 に収まる最大文字列長を指定します。文字列ターミネータはこれにカウントされないbufferことを覚えておいてください。そのため、バッファのサイズ - 1 を使用する必要があります。つまり、eg: にハードコードするか、正しいフォーマット文字列をコンパイルします。実行時に。'\0'%50s
  • malloc(BUFFSIZE*strlen(buffer))おそらく、実際に割り当てたいサイズではありません
  • 常にmalloc()戻り値をチェックしてください!
于 2012-11-18T00:21:34.190 に答える