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 回答