C--程序无法正确读取文件结尾

时间:2018-12-10 04:16:39

标签: c file feof

我正在尝试制作一组​​基本程序,其中一个程序要求用户提供一组值,该值将程序写入文件中,而另一个程序从该文件中读取值并将它们打印到屏幕上。这是我的代码:

阅读程序如下:

当我运行两个程序时,第一个程序成功写入“ inventory.txt”,但是读取函数会复制最后一组值。看起来像这样:

Please enter item data (part number, quantity, price): 3, 1, 3.0
Please enter item data (part number, quantity, price): 0

Below are the items in your inventory.
Part#   Quantity    Item Price
    3          1    $      3.00
    3          1    $      3.00

我相信问题出在我的while(feof(fp)== 0)上,但是我不太了解feof的工作原理,并且我不知道如何在不使用“ break;”的情况下替换它。

如何解决此重复问题?

2 个答案:

答案 0 :(得分:0)

看起来很正常。读完最后一行后,尚未读完最后一个字符(用于表示输入终止的“ 0”),因此feof(fp)返回0,程序再次进入循环。

答案 1 :(得分:0)

出现明显重复的行的原因是feof()的行为。 man

  

feof()函数测试stream指向的流的文件结尾指示符,如果设置为非零,则返回非零值。

含义,feof()测试是否已设置EOF标志。到达文件末尾,但不能 over ,不会设置该标志。因此,执行了另一个迭代,该迭代设置了EOF标志,而没有更改变量值,给人以重复的印象。

您可以更改逻辑并使用{​​{1}},也可以将程序更改为类似的内容

fgets()

或更轻

int eof;
do {  
    eof = fread(&pn, sizeof(int), 1, fp) < 1;
    if ( !eof ) {
       fread(&quantity, sizeof(int), 1, fp);
       fread(&price, sizeof(float), 1, fp);
       printf("%5d\t%8d\t$ %9.2f\n", pn, quantity, price);
    }
} while ( !eof );