C++ fstream读取文件,最后一个字符被读取两遍的原因

参考了http://blog.csdn.net/candyliuxj/article/details/6259477

 

今天遇到了一个关于文件读写的问题,觉得很奇怪。

将问题简化了下,写了个小程序,源代码如下:

   fstream fin("/home/hero/HeroProgram/sort",ios::in);
    int n = 0;   while(!fin.eof())
    {
        fin>>n;
        cout<<n<<“ ,”; 
    }
    fin.close();

sort里放了两个整数,1296  1888,结果cout的输出结果却是:1296,1888,1888

预期结果应该最后只输出一个1888,可是输出了两个,这是为什么呢?

我后来上网搜索了一下,有这样一个解释,我觉得有点道理:

     事实上,文件本身是没有文件结束符EOF的。当读取文件中最后一个有效字符后,虽然文件指针已指向空白了,但这时还不知道是否到了文件末 尾,只有再读取一次文件,待读不到任何内容了,这时输入流设置eofbit位,eof的返回值才为l,而空的内容是不会被提取到变量的,故最后一次读到变 量中的内容又被重复输出了。

大家可以再找找看看关于eof()函数的源文件,看有没有更好的解释。

可以这样修改达到我们预期的效果:

   fstream fin("/home/hero/HeroProgram/nosort",ios::in);
    int n = 0;
    fin>>n;
    while(!fin.eof())
    {       
        cout<<n<<“,”;
        fin>>n;
    }
    fin.close();

经过这样修改后,输出了预期的结果:1296,1888.

 

posted on 2013-08-26 19:52  chenyingjie2012  阅读(1019)  评论(1)    收藏  举报