从文件中读取整数

时间:2012-08-22 07:41:47

标签: c

使用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);     
    }
}

5 个答案:

答案 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),你应该从循环中断开。

在这种情况下,你只需在最后一条读线上工作两次。

来自the documentation

  

返回值

     

成功完成后,这些功能将返回数字   成功匹配并分配了输入项;

答案 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