使用feof()
功能,在我的输出文件中,我打印了两次最后一个值。我怎么能避免这种情况?我的输出应该是
12 6 15 13
我有
12 6 15 13 13
谢谢!
while(!feof(pfile1))
{
sum=0;
fscanf(pfile1,"%d%d%d",&choice,&day,&val);
if(choice==0)
{
i=day-1;
a[i]=a[i]-val;
}
else if(choice==1)
{
for(i=day-1;i<=val-1;i++)
{
sum=sum+a[i];
}
fprintf(pfile2,"%d\n",sum);
}
}
答案 0 :(得分:1)
这是因为只有在读取文件结尾时才会设置feof标志。 要解决此问题,请使用下面的fscanf替换feof,并检查参数的数量。
如果它低于3,则表示发生了一些错误...例如文件结束已到达。
事实上,你应该尽可能避免因为上述原因而使用feof。
使用一些代码强调这一点:
while(fscanf(pfile1,"%d%d%d",&choice,&day,&val) == 3) {
//Continue reading
}
fclose(pfile1);
fclose(pfile2);
答案 1 :(得分:1)
发布的代码在处理不成功的读取之后才会检测到feof()
,从而导致您看到的行为。
您需要在致电feof()
后立即检查fscanf()
或查看fscanf()
的结果,该结果会返回作出的分配数量:
if (3 == fscanf(pfile1,"%d%d%d",&choice,&day,&val))
{
/* All three integers successfully read. */
}
循环的另一种可能结构(如MichalAnderson的评论中所述):
while (3 == fscanf(pfile1,"%d%d%d",&choice,&day,&val))
{
}
答案 2 :(得分:1)
一种选择是检查fscanf
的返回值:
成功时,该函数返回成功读取的项目数。在匹配失败的情况下,该计数可以匹配预期的读数数量或者小于零。 如果在成功读取任何数据之前输入失败,则返回EOF。
所以,比如:
if( fscanf(pfile1,"%d%d%d",&choice,&day,&val) <= 0 )
{
break;
}
另一个选项是在执行feof
后检查fscanf
。例如:
if( feof( pfile1 ) )
{
return; // or something
}
do
{
// the same loop body
}
while( ! feof( pfile1 ) );
答案 3 :(得分:0)
你应该检查fscanf
返回的阅读元素的数量:如果它不是你正在等待的(3),你应该从循环中断开。
在这种情况下,你只需在最后一条读线上工作两次。
返回值
成功完成后,这些功能将返回数字 成功匹配并分配了输入项;
答案 4 :(得分:0)
fscanf(pfile1,"%d%d%d",&choice,&day,&val);
这里是从输入文件中读取整数。 fscanf将扫描文件,直到它到达EOF。 每次读取三个整数时,它返回3。如果fsacnf返回的值小于3,那么它 自动分配缓冲区值。这就是在输出中获得重复值的原因。
如果编辑程序时检查fscanf()的返回值为值3,然后执行if else语句 选择将产生所需的输出。
示例1: -
考虑带有内容的输入文件: -
0 2 3
1 1 2
( - blank--) //这里fscanf将扫描一个整数,但由于它是一个空行,它将到达EOF,并返回-1并使用缓冲区值(之前的值)
然后输出文件: -
118
118
示例2: -
输入文件(不带空行): -
0 2 3
1 1 2
输出文件: -
118