代码:
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);
}
我在这里遇到两个问题:
答案 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 写入它,它不会将数据转换为文本,而只是转储文件的内部格式。
如果你在某种二进制编辑器中查看创建的文件,你会发现它包含数据。