C--程序没有正确读取文件末尾

C--Program not reading end of file correctly

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

阅读程序如下:

当我 运行 两个程序时,第一个成功写入 "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 是如何工作的,我不知道如何在不使用 [=22= 的情况下替换它]

我该如何解决这个重复问题?

看起来很正常。当读到最后一行时,最后一个字符(你用来表示输入结束的“0”)还没有读到,所以feof(fp) returns 0,程序再次进入循环时间.

明显重复行背后的原因是 feof() 行为。 man

The function feof() tests the end-of-file indicator for the stream pointed to by stream, returning nonzero if it is set.

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

您可以更改逻辑并使用 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 );

或者,打火机

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