使用fread时,数据被打印两次

时间:2014-10-31 06:45:06

标签: c file-io struct fread

我正在使用二进制文件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)但是无法弄清楚

1 个答案:

答案 0 :(得分:1)

最后一个条目的双重处理来自使用feofusually not a good way to control file Input loops

相反,您应该检查阅读函数fgetcfgets的返回值,在您的情况下,freadfread返回项目数,即读取的size字节块数。如果它小于要读取的项目数,则读取不完整。所以:

while (fread(&temp, sizeof(struct entry), 1, fp) == 1) {
    printf("%s  %s  %s \n", temp.name, temp.design, temp.contact);
}

只要您完整阅读,就打印出数据。

其他人已经指出,在读取之前打印(未初始化的)数据会导致您的垃圾值。如果你必须使用这样的设置,你至少应该在循环之前放置一个读数。