繁体   English   中英

从文件读取整数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM