0

代码:

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 处等待。
4

3 回答 3

1

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

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

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

7.19.5.2.2 如果流指向输出流或更新流,其中最近的操作没有被输入,fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

于 2012-11-04T06:52:13.420 回答
0

fflush如果你有fclose.

但在你的情况下,你有while(1)fclose外部,这意味着fclose永远不会被调用,所以文件内容永远不会被fclose函数更新。

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

于 2012-11-04T06:51:32.560 回答
0

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

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

于 2012-11-04T06:53:22.893 回答