[英]Reading integers from a file
使用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);
}
}
这是因为feof标志只会在您读取PAST文件末尾时设置。 要解决此问题,请从下面用fscanf替换feof,并检查参数数量。
如果小于3,则说明发生了某些错误...例如到达文件末尾。
实际上,由于上述原因,应尽可能避免使用feof。
用一些代码强调这一点:
while(fscanf(pfile1,"%d%d%d",&choice,&day,&val) == 3) {
//Continue reading
}
fclose(pfile1);
fclose(pfile2);
在处理不成功的读取之后,发布的代码将不会检测到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))
{
}
一种选择是检查fscanf
的返回值:
成功时,该函数返回成功读取的项目数。 在匹配失败的情况下,此计数可以与预期的读数数匹配,或者小于甚至为零。 如果在输入数据失败之前无法成功读取任何数据,则返回EOF。
因此,类似:
if( fscanf(pfile1,"%d%d%d",&choice,&day,&val) <= 0 )
{
break;
}
另一个选项是在执行fscanf
之后检查feof
。 例如:
if( feof( pfile1 ) )
{
return; // or something
}
do
{
// the same loop body
}
while( ! feof( pfile1 ) );
您应该检查fscanf
返回的已读取元素的数量:如果不是您要等待的内容(3),则应该退出循环。
在这种情况下,您只需在最后一条读取行上进行两次操作即可。
从文档中 :
返回值
成功完成后,这些功能应返回成功匹配和分配的输入项的数量;
fscanf(pfile1,"%d%d%d",&choice,&day,&val);
在这里,您正在从输入文件中读取整数。 fscanf将扫描文件,直到到达EOF。 每次读取三个整数都返回3。 如果fsacnf返回的值小于3,则它将自动分配缓冲区值。 因此,这就是在输出中获得重复值的原因。
如果通过检查fscanf()的返回值是否为3来编辑程序,然后执行关于select的if else语句,将提供所需的输出。
示例1:
考虑输入文件的内容:
0 2 3
1 1 2
(--blank--) //此处fscanf将扫描整数,但由于其为空行,它将到达EOF,并返回-1并使用缓冲区值(以前的值)
然后输出文件:
118
118
示例2:
输入文件(无空行):-
0 2 3
1 1 2
输出文件:-
118
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.