看下面一段代码:

 
    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
 

ifstream文件尾最后一行读两次的更多相关文章

  1. c++ 读取文件 最后一行读取了两次

    用ifstream的eof(),竟然读到文件最后了,判断eof还为false.网上查找资料后,终于解决这个问题. 参照文件:http://tuhao.blogbus.com/logs/21306687 ...

  2. 有关fgetc配合feof逐行读取文件最后一行读取两遍的错觉?

    最近在做一个wifiap设置的接口,用户首先获取到当前wifi 热点的ssid 和pwd,然后修改,保存. 获取信息的时候是fopen对应的hostapd.conf文件,逐行读取,查找匹配的参数. 修 ...

  3. c++ ofstream & ifstream文件流操作

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; //ofstream & ifstream inherit from istream class ...

  4. python : 将txt文件中的数据读为numpy数组或列表

    很多时候,我们将数据存在txt或者csv格式的文件里,最后再用python读取出来,存到数组或者列表里,再做相应计算.本文首先介绍写入txt的方法,再根据不同的需求(存为数组还是list),介绍从tx ...

  5. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

  6. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  7. shell读取文件的每一行内容并输出【转】

    写法一: #!/bin/bash while read line do echo $line done < file(待读取的文件) 写法二: #!/bin/bash cat file(待读取的 ...

  8. Python遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例

    遍历目录下所有文件的最后一行进行判断若错误及时邮件报警-案例: #-*- encoding: utf-8 -*- __author__ = 'liudong' import linecache,sys ...

  9. sort将文件的每一行作为一个单位按ASCII码值进行比较

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

随机推荐

  1. ubuntu权限管理常用命令 分类: linux ubuntu 学习笔记 2015-07-05 14:15 77人阅读 评论(0) 收藏

    1.chmod 第一种方式 chomd [{ugoa}{+-=}{rwx}] [文件或者目录] u 代表该文件所属用户 g 代表该文件所属用户组 o 代表访客 a 代表所有用户 +-=分别表示增加权限 ...

  2. IntelliJ插件安装

    1. 插件管理器在线安装 在IntelliJ插件管理页面([FileàSettingsàIDE SettingsàPlugins]),点击[Browse repositories-]按钮,在搜索框内输 ...

  3. bootstrap02导航菜单

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. C#选择文件、选择文件夹、打开文件(或者文件夹)

    1.选择文件用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;//该值确定是否可以 ...

  5. SQL_server 的基本操作

    1.---------------数据库基本操作 主键 : 1.不重复 2.不为NULL外键 1.取消重复行(消除完全一样的行,保留一行)select distinct cloumname1,clou ...

  6. Tran 与 Goto try catch raiserror等浅显应用

    ---- Tran 事务 以及 Goto 的浅显应用 IF OBJECT_ID('tempdb..#tmptab','U') IS NOT NULL DROP TABLE #tmptab GO CRE ...

  7. 查看oracle 启动了多久

    想看一下系统正常运行了多少天?开机多长时间没有重启了? windows系统 C:\>systeminfo |find “系统启动时间”系统启动时间:     265 天 4 小时 26 分 32 ...

  8. strace跟踪操作的详细内容

  9. ExtJs中处理时间,出现NaN-NaN-NaN的解决方式

    关键字: extjs日期格式问题(二) 一般我们的前台代码Ext.grid.ColumnModel里会这样写,以便显示日期格式: Js代码 1.....   2.{header:"birth ...

  10. ios 设置label的高度随着内容的变化而变化

    好吧 步骤1:创建label _GeRenJianJie = [[UILabel alloc]init]; 步骤2:设置label _GeRenJianJie.textColor = RGBAColo ...