什么都没有写入文件

时间:2012-11-04 06:44:09

标签: c file fwrite getchar

代码:

struct subscriber
{
char phonenumber[20];
char name[50];
float amount;
}s;

void addrecords()
{
  FILE *f;
  char test;
  f=fopen("file.txt","ab+");
  //if(f==0)
  //{   f=fopen("file.txt","wb+");
    //system("clear");
    //printf("please wait while we configure your computer");
    //printf("/npress any key to continue");
    //getchar();
    //getch();
  //}

  while(1)
  {
    //system("clear");
    printf("\n Enter phone number:");
    scanf("%s",s.phonenumber);
    printf("\n Enter name:");
    fflush(stdin);
    //scanf("%[^\n]",s.name);

    scanf("%s",s.name);
    printf("\n Enter amount:");
    scanf("%f",&s.amount);
    printf("check 1");
    fwrite(&s,sizeof(s),1,f);
    fflush(stdin);
    printf("check 2");
    //system("clear");
    printf("1 record successfully added");
    printf("\n Press esc key to exit, any other key to add other record:");
    test=getchar();
    //test=getche();
    if(test==27)
      break;
  }
  fclose(f);
}

我在这里遇到两个问题:

  1. 虽然正在创建文件,但没有任何内容写入文件。
  2. 输入金额后,它会输出所有的打印语句,然后转到while循环的初始位置,它不会在getchar中等待。

3 个答案:

答案 0 :(得分:1)

最后一个scanf()没有在输入结束时读取换行符,这就是getchar()立即返回而不等待的原因,这也是第一个问题的原因,为什么文件不写,因为您必须终止程序退出并且文件未刷新。所以你需要在最后一次输入结束时使用换行符char,你可以使用scanf()

scanf("%f%*[^\n]%*c",&s.amount);

或使用fgets()阅读整行并在其上使用scanf()。最后,请注意,您不应使用fflush()来清除输入流,它是未定义的:

  

7.19.5.2.2如果流指向输入流或未输入最近操作的更新流,则fflush功能   导致该流的任何未写入数据传递到主机   要写入文件的环境;否则,行为是   未定义。

答案 1 :(得分:0)

如果你有fflush,则永远不需要{p> fclose

但在您的情况下,您在while(1)fclose之外,这意味着fclose永远不会被调用,因此文件内容永远不会被fclose函数更新。

您可能希望在循环中使用fflush,例如在fwrite之后,它会将缓冲区刷新到实际文件。

答案 2 :(得分:0)

您已将文件命名为 file.txt ,因此我假设您打算将该文件作为文本文件?但是你用 b 标志打开它,它表示二进制格式,你用 fwrite 写入它,它不会将数据转换为文本,而只是转储文件的内部格式。

如果你在某种二进制编辑器中查看创建的文件,你会发现它包含数据。