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)- 除非您在具有不同字节序的机器上运行应用程序,否则它是安全的)。

也就是说,有几个观察:

  • 使用switch而不是 multiple if(user_entry==x),在else部分中执行某些操作(打印警告或其他) - 它通常表示代码中的常规或错误分支。
  • 使用 width infscanf(read, "%s", buffer)来指定可以容纳的最大字符串长度buffer,请记住,'\0'字符串终止符不计入此值,因此您需要使用缓冲区大小 - 1。即将其硬编码为例如:%50s或编译正确的格式字符串在运行时。
  • malloc(BUFFSIZE*strlen(buffer))可能不是您真正想要分配的大小
  • 总是检查malloc()返回值!
于 2012-11-18T00:21:34.190 回答