【问题标题】:data being printed out twice when using fread [duplicate]使用 fread 时数据被打印两次 [重复]
【发布时间】:2014-10-31 06:45:05
【问题描述】:

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

【问题讨论】:

  • printing beofre reading.. 你觉得怎么样?听起来不是//Some garbage values ??
  • 检查fread的返回值。它无法读取最后一个条目,但temp 仍然保存旧数据。
  • @Sourav 我知道,但我试图弄清楚它是否被打印了两次或阅读了两次打印之前阅读让我清楚地知道阅读有问题
  • @keltar 那么为什么 !feof() 不停止它在文件结束时进一步阅读
  • @SayamQazi 因为它在(失败)fread 和 printf 之后检查。

标签: c file-io struct fread


【解决方案1】:

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

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

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

只要你有完整的阅读,打印出数据。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2017-11-26
    • 2014-06-04
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多