zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    Axios 各种请求方式传递参数格式
    axios POST提交数据的三种请求方式写法
    Json对象和Json字符串的区别
    ASP.NET Core 使用 AutoFac 注入 DbContext
    asp.net core signalr Error: Failed to start the transport 'WebSockets': null
    js中settimeout和setinterval的区别是什么?
    VS IDE开发字体推荐
    .net core ef core 自动迁移,自动修改数据库
    localstorage和sessionstorage的区别
    TinyOS编程
  • 原文地址:https://www.cnblogs.com/youxin/p/3793814.html
Copyright © 2011-2022 走看看