看下面一段代码:

 
    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. Eclipse优化集合,Eclipse优化速度,解决Ctrl+C、Ctrl+V卡

    Eclipse优化集合,Eclipse优化速度,解决Ctrl+C.Ctrl+V卡 >>>>>>>>>>>>>>> ...

  2. 求职,找工作,平台大PK

    国内 猎聘网:www.lietou.com 拉钩网:Lagou.com 智联招聘:www.zhaopin.com 前程无忧:http://www.51job.com/ 中华英才网:chinahr.co ...

  3. Sql Xml

    /* sql xml 入门: --by jinjazz --http://blog.csdn.net/jinjazz 1.xml: 能认识元素.属性和值 2.xpath: 寻址语言,类似windows ...

  4. Jsoup解析Html教程

    Jsoup应该说是最简单快速的Html解析程序了,完善的API以及与JS类似的操作方式,为Java的Html解析带来极大的方便,结合多线程适合做一些网络数据的抓取,本文从一下几个方面介绍一下,篇幅有限 ...

  5. Fast Report Data Filter

    使用Data Filter两种方式:一种是 直接在Filter 属性里写表达式 ,另外一种就是在beforePrint 事件里写方法. 今天开发时遇到了一个Filter的问题,不知道是不是fast r ...

  6. LCS最长公共子序列HDU1159

    最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...

  7. ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等

    [摘要]ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.本文介绍ThinkPHP 中使用 PHPMailer 发送邮件. PHP是自带可以发送邮件的Ma ...

  8. Linux 特殊权限位

    特殊权限位 LINUX 基本权限有9位但是还有三位特殊权限. suid s(有x权限) S(没有x权限) 4 在用户权限的第三位 sgid s(有x权限) S(没有x权限) 2 在用户组权限的第三位 ...

  9. 在本地Apache服务器配置虚拟主机站点

    Apache 配置localhost虚拟主机步骤1,打开apache目录下httpd.conf文件,找到如下模块        # Virtual hosts        #Include conf ...

  10. angularJs 页面筛选标签小功能

    页面html: <div class="bar bar-calm bar-header"> <div class="title">新闻分 ...