提问人:Sinclair 提问时间:12/10/2018 最后编辑:Sinclair 更新时间:12/12/2018 访问量:458
C--程序未正确读取文件末尾 [duplicate]
C--Program not reading end of file correctly [duplicate]
问:
我正在尝试制作一组基本的程序,其中一个程序要求用户提供一组值,程序将这些值写入文件,另一个程序从文件中读取值并将它们打印到屏幕上。这是我的代码:
阅读程序如下:
当我运行这两个程序时,第一个程序成功地写入“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 是如何工作的,我无法弄清楚如何在不使用“中断”的情况下替换它;
如何解决此重复问题?
答:
0赞
rect0x51
12/10/2018
#1
看起来很正常。当读取最后一行时,最后一个字符(用于表示输入终止的“0”)尚未读取,因此,feof(fp) 返回 0,程序再次进入循环。
0赞
Julius
12/10/2018
#2
明显重复行背后的原因是行为。男人说feof()
函数 feof() 测试流指向的流的文件结束指示符,如果设置了非零,则返回非零。
意思是,测试是否设置了 EOF 标志。到达文件末尾,但不在文件末尾,不会设置标志。因此,在不更改变量值的情况下执行另一次迭代,该迭代设置 EOF 标志,给人以重复的印象。feof()
您可以更改逻辑并使用 ,也可以将程序更改为类似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);
}
评论