zoukankan      html  css  js  c++  java
  • 关于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 ;
    }

  • 相关阅读:
    实际运用中DataSet、DataTable、DataRow点滴
    SQL语句AND 和 OR执行的优先级
    CS程序,服务器端弹出MessageBox.Show()之类的UI操作???禁止
    使用动态SQL语句实现简单的行列转置(动态产生列)
    表的行列转置
    统计每种车型的数量
    由CAST()函数在.NET1.1和.NET4.0下处理机制不同所引发的BUG
    转载——网站重构的8点建议
    float,double和decimal类型
    优化DB2缓冲页的大小
  • 原文地址:https://www.cnblogs.com/fanling999/p/4458742.html
Copyright © 2011-2022 走看看