• 关于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 ;
    }

  • 相关阅读:
    GS 原理及破解 《0day安全》
    Windows 2000 栈溢出 利用异常
    windows2000 堆溢出 利用原理
    数据类中引用virtual
    DevExpress 程序运行后 layoutView 卡片大小发生变化
    DevExpress 标题栏添加搜索功能
    DevExpress 关于alertControl 图片显示
    DevExpress 关于alertControl 改变其大小
    DevExpress GridControl 选择整行被选单元格不变色的设置
    DevExpress 在使用Ribbon皮肤时标题栏不变化的原因
  • 原文地址:https://www.cnblogs.com/fanling999/p/4458742.html
Copyright © 2020-2023  润新知