我正在使用二进制文件IO函数读取文件 fread 当我运行程序时,最终条目打印出两次
FILE *fp;
struct entry temp;
if (fp = fopen("recs.bin","rb"))
{
while (!feof(fp))
{
fread(&temp,sizeof (struct entry),1,fp);
printf("%s %s %s \n", temp.name ,temp.design ,temp.contact);
}
fclose(fp);
else
{
printf("\error opening file\n");
}
当我运行代码时,输出如下
Pfor.ABC Professor 9867552
Sir Blah lecturar 9237434
Miss etc Asst. Porfessor 03847363
Miss etc Asst. Porfessor 03847363
我总是两次获得最后一个条目 我尝试通过打印如下所示阅读
while (!feof(fp))
{
printf("%s %s %s \n", temp.name ,temp.design ,temp.contact);
fread(&temp,sizeof (struct entry),1,fp);
}
现在输出
#gd^&!d $!du(! #$@%@22 //Some garbage values
Pfor.ABC Professor 9867552
Sir Blah lecturar 9237434
Miss etc Asst. Porfessor 03847363
现在解决了两次打印但正在打印垃圾值 我认为它的问题在 feof(fp)但是无法弄清楚
答案 0 :(得分:1)
最后一个条目的双重处理来自使用feof
,usually not a good way to control file Input loops。
相反,您应该检查阅读函数fgetc
,fgets
的返回值,在您的情况下,fread
。 fread
返回项目数,即读取的size
字节块数。如果它小于要读取的项目数,则读取不完整。所以:
while (fread(&temp, sizeof(struct entry), 1, fp) == 1) {
printf("%s %s %s \n", temp.name, temp.design, temp.contact);
}
只要您完整阅读,就打印出数据。
其他人已经指出,在读取之前打印(未初始化的)数据会导致您的垃圾值。如果你必须使用这样的设置,你至少应该在循环之前放置一个读数。