关于C++ 的eof

#include<iostream>
#include<fstream>

#define MAXSIZE 1000

using namespace std;

int main()
{
    int a[MAXSIZE];
    ifstream fin("input.txt");
    if( !fin.is_open() )
    {
        cout<<"open file error"<<endl;
        return 0;
    }
    
    int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.good())
        {
            a[n++] = num;
        }
    }
}

 

 【问题】

  使用以上代码,最后会多输入一个数。循环明明是通过判断,eof,是否是文件尾来终止的,可是却会多长一个数字。在网上搜了相关的问题。原因大概是这样的:

  这是由于C++输入输出流判断末尾的方式不一样,根据是:当 fin>>num 不能再读入数据时,才能发现到了文件结尾,这是才会给输入文件流设置文件结尾标志,即eofbit标志,参会返回true。若此时 num 是文件中的最后一个数字,那么在读入该数字之后,eofbit 是不会马上被设置的,因为此时可以正常输入最后一个数字,fin流会认为文件还没有到末尾,所以while循环中 fin.eof() 为false,还要执行一次,这是数据已被读完,所以继续进行fin>>num,则会多出一个数字,这有可能是最末尾一个数字重复出现,也可能是其它奇怪的数字,这个时候fin才能发现文件到达末尾,进而设置 eofbit 标志,跳出循环,但是在此之前已经多读入一个多余的数字了。

    简单来说,就是 fin 在读入最后一个数字的时候,eof() 还是为 FALSE,只有当最后一个数字读入以后,再次使用fin输入,才能发现到达文件末尾,eof() 才为true。

【解决方案】

(1)

    int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.good())
        {
            a[n++] = num;
        }
    }

(2)

    int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.fail())
        {
            a[n++] = num;
        }
    }

(3)

peek 函数只适用于字符,也就是char类型,对于str类型,和int类型,我试过都不行,还是会对出一个。

char c;
while(fin.peek()!=EOF)
{
        fin >> c;
        cout << c ;
}

 

posted @ 2015-04-26 23:37  .....?  阅读(1349)  评论(0编辑  收藏  举报