我正在尝试制作一组基本程序,其中一个程序向用户请求一组值,该程序将这些值写入文件,另一个程序从文件中读取值并将其打印到屏幕上。这是我的代码:
读取程序如下:
当我运行这两个程序时,第一个程序成功地写入"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;"的情况下替换它
如何解决此重复问题?
明显重复行背后的原因是feof()
行为。男子说
函数feof((测试流指向的流的文件结尾指示符,如果设置了该指示符,则返回非零。
意思是,feof()
测试EOF标志是否已设置。到达文件末尾,但不是超过,不会设置标志。因此,执行另一次迭代,设置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("%5dt%8dt$ %9.2fn", 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("%5dt%8dt$ %9.2fn", pn, quantity, price);
}
看起来很正常。读取最后一行时,尚未读取最后一个字符(用于表示输入终止的"0"(,因此feof(fp(返回0,程序再次进入循环。