0

ファイルを読み書きできる機能を提供しようとしている電話帳アプリがあります。ファイルの書き込み方法はかなり簡単に理解できましたが、ファイルを読み取るのは本当に行き詰まりました。私の主な問題は、ファイルをループさせることができないことだと思います(通常、ループに到達するとすぐにクラッシュします)。以下は私の影響を受けた機能です。

構造、メイン、およびメニュー機能は次のとおりです。

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_entry2=0;
char user_entry3[50]={'\0'};

printf("Welcome! Would you like to import a file? (1)Yes or (2) No");
scanf("%d",&user_entry);
if(user_entry==1)
     {

     file2(friends,counter,i,user_entry3);


     }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);
       file2(friends ,counter,i,user_entry3);

   } 
 }while(user_entry!=5);
   if(user_entry==5)
   {
      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!"); 
       }
   }

}

ファイルの読み取りを処理する関数を次に示します。

void file2(fr*friends ,int* counter, int i, char user_entry3[50])
{

     FILE *read;

     printf("Please enter a file name");
     scanf("%s",user_entry3);
     read=fopen(user_entry3,"r");
    //This is where the crash is taking place!!**
     while(!feof(read)){
        fscanf(read,"%s %s %s %s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);
        printf("\n""%s ""%s ""\n""<Home>""%s""\n""<Cell>""%s""\n",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);

      }

今、私が求めていることとは関係のないプログラムに他の問題があるかもしれないことを理解していますが、私はCに慣れていないので、これは進行中の作業です. これがクラッシュするのを防ぐ方法と、これを残りの連絡先に追加する方法を理解する必要があります(これについては考えがあると思います)、それは私を夢中にさせています! 前もって感謝します。

4

1 に答える 1

1

未定義のメモリ領域にデータを読み込んでいます (構造体の 4 つの文字列ポインターに値を割り当てることはありません)。friends[i].First_Name、、および.Last_Nameにメモリを割り当てているようには見えません。.home.cell

次のように構造体を変更したい場合があります。

typedef struct friends_contact{
   char First_Name[50+1]; // +1 for the '\0' terminating character
   char Last_Name[50+1];
   char home[50+1];
   char cell[50+1];
}fr;

もちろん、ファイルに 50 文字を超える部分 ('\0' 終端を含む) が含まれている場合、fscanf次のように各文字列の最大長を指定しない限り、長さをチェックしないため、コードは再びクラッシュします。

fscanf(read,"%50s %50s %50s %50s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);

構造体でポインターを使用する場合はmalloc()、読み取りの前に使用して各構造体メンバーにメモリを割り当てfree()、必要がなくなったら割り当てられたメモリを解放するために使用する必要があります。

于 2012-11-17T18:01:43.490 に答える