• ifstream文件尾最后一行读两次


    看下面一段代码:
     
        ifstream m_fileConfig;
        string str;
        m_fileConfig.open(FILE_OPERATORS, ios::out);
        while(!m_fileConfig.eof()){
            m_fileConfig >> str;
            cout << str << endl;
        }
    打印结果  FILE_OPERATORS 中的最后一条总被多读了一次。。。
     
    原因分析   eof()没有问题     
        当你的文件指针到达文件末尾时     
        执行feof不会返回       1     
        要到下一次读取才会返回。     
          
        在读取最后一个之后,     
        虽然到了末尾     
        但是feof(fp)还是返回0     
        直到ch=fgetc(fp);       //文件结束后再读了一次     
        然后的eof才返回
     
    其实最后那个数据并没有读取了两次, 
    只在用eof()来判断时,如果读取到了文件的数据末尾,但还没到文件的结束标识EOF, 
    再读取sizeof(buf))大小的数据时,fstean流的状态会标识为失败,但buf中的值没有被改变,还是保存了上一次读取的数据。 

    可以用下面的方法验证: 

    while(!from.eof()) 

    from.read((char*)(&buf),   sizeof(buf)); 
    std::cout   < <   buf   < <   endl;//最后一次会输出0 
    buf   =   0; 



    /////////////////////////////////////////////////////////// 
    所以读取文件数据时,一般可以考虑使用 from.eof()与from.fail()结合来判断。 
          fail() 判断最后的一次读写操作是否成功;
    代码这样改   
        ifstream m_fileConfig;
        string str;
        m_fileConfig.open(FILE_OPERATORS, ios::out);
        while(!m_fileConfig.eof()){
            m_fileConfig >> str;
            if(m_fileConfig.fail()) {
                break;
            }
            cout << str << endl;
        }
     注意:ifstream in;
    in>>str;
    if(in.fail())
      break;
    读取要在in.fail()函数的前面。
    参考:
    http://hi.baidu.com/windey1988/item/ae2a24e5586643324ddcafa5
     
  • 相关阅读:
    linux查找日志技巧
    路径选择算法|Floyd算法|Dijkstras算法(带GUI界面带实验报告)
    待整理
    ClassLoader类加载解惑
    SAX解析xml
    DOM 表单应用
    网站前端优化14条
    用wordpress制作网站的总结
    海豚浏览器前端面试总结
    程序员的美妙生活
  • 原文地址:https://www.cnblogs.com/youxin/p/3793814.html
Copyright © 2020-2023  润新知