C 功能“;fwrite";写入意外记录
有人能帮我更正下面的代码吗C 功能“;fwrite";写入意外记录,c,file-io,struct,C,File Io,Struct,有人能帮我更正下面的代码吗 int main() { FILE *fp; char another='Y'; struct emp { char name[40]; int age; float bs; //basic salary }e; fp=fopen("Employee.DAT","wb"); if(fp==NULL) { printf("Cannot open
int main()
{
FILE *fp;
char another='Y';
struct emp
{
char name[40];
int age;
float bs; //basic salary
}e;
fp=fopen("Employee.DAT","wb");
if(fp==NULL)
{
printf("Cannot open file");
exit(1);
}
while(another=='Y')
{
printf("\nEnter name, age and basic salary:");
scanf("%s %d %f",e.name,&e.age,&e.bs);
fwrite(&e,sizeof(e),1,fp);
printf("Add another record?(Y/N)");
fflush(stdin);
another=getche();
}
fclose(fp);
return 0;
}
我正在尝试将以下记录输入文件“Employee.DAT”:Abc 19 12345
Def 20 12345
但我在文件“Employee.DAT”中得到了预期的输出,如下图所示:
我认为问题出在“fwrite”上,但我无法找出问题所在
fwrite(&e,sizeof(e),1,fp);
您以错误的顺序提供了参数
fwrite(&e,1,sizeof(e),fp);
这是正确的顺序
这是什么定义-
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
fwrite
不是此处使用的正确函数。它不关心格式、结构填充(e
可能有填充)等。它只会尝试写入您要求写入的块数
如果需要格式化文件IO(这是基于预期输出所需的),请改用。如果需要格式化输出,可以使用fprintf()
打印单个元素。有关更多信息,请参阅
另外,不要执行fflush(stdin)
。是的
也就是说,
main()
的建议签名是int main(void)
您在写入前是否打印了e.name
、e.age
和e.bs
?它包含好的价值观吗?如果是这样,我建议您创建一个输出字符串,首先以您想要的格式存储变量:
char output[MAX_OUTPUT_LENGTH];
...code...
scanf("%s %d %f",e.name,&e.age,&e.bs);
sprintf(output, "%s %d %f", e.name,e.age,e.bs);
fwrite(output,1,sizeof(output),fp);
Joachim注意到的另一件事:您可能希望像这样打开文件:
fp = fopen("Employee.DAT", "w");
你怎么看这个文件?你知道它是二进制的,通常不能作为文本文件阅读吗?它是二进制的,这意味着你写的数据是用计算机使用的内部二进制格式写的,你不能简单地在文本文件中打开文件,然后希望看到你写的作为文本的数字。哦,顺便说一下,不要做
fflush(stdin)
,C标准不支持它。@JoachimPileborg该文件是在我保存程序的文件夹中创建的。请不要养成这样转储结构的习惯。当任何事情发生变化时,你将陷入痛苦的世界。新的编译器、体系结构或修改的结构有可能以非直观的方式破坏文件读取。@moffeltje我知道这是OT,但OP是学生,可能会从推动设计中受益。结构的成员如何存储在内存中取决于编译器的实现,并且经常为内存对齐而进行填充,“int”和“float”的存储也取决于计算机体系结构。因此,将同一程序编写的同一文件与不同时间的相同数据进行比较可能会显示差异,因为填充中存在“垃圾”,这取决于初始化结构的方式。我建议定义一种已知的、最好是基于文本的格式,就像你在回答中建议的那样。由于他只写一条记录,因此它仍将写入该记录。但尝试写入多条记录时出错。你确定吗?我希望它“只”会让程序员感到困惑,除非触发了一些特殊情况?@SamuelÅslund是的,我确信这一点。