出处:http://blog.csdn.net/shuilan0066/article/details/4669451

在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记下来。

其实在循环判断文件是否结束的时候可以直接就流输入放在循环条件那里,但是这里补充使用eof()的一些细节问题。其实这是关于到底什么时候标志位才会变化的问题。总结起来就是只有使用一次流变量来输入输出,标志位才会更新一次。

正文:

fstream流的eof()  判断有点不合常理

按正常逻辑来说,如果到了文件末尾的话 ,那eof()应返回真

但是,c++输入输出流如何知道是否到末尾呢?

原来是根据的是: 如果fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。

假设

fin>>x; //此时文件刚好读完最后一个数据(将其保存在x中)

但是, 这时 fin.eof()仍未假 因为,fin流的标志eofbit是FALSE, fin流此时认为文件还没有到末尾

只有当流再次读写时

fin>>x; 发现已无可读写数据,此时流才知道到达了结尾,这时才将标志eofbit修改为TRUE

此时流才知道了文件到底了末尾

也就是说,eof在读取完最后一个数据后,仍是False,

当再次试图读一个数据时,由于发现没数据可读了 才知道到末尾了,此时才修改标志,eof变为TRUE

以下例子:

  ifstream fin("D://line.txt");

  ofstream fout("D://T_line.txt",ios::trunc);

  list<tag_Point> test_list;

  tag_Point test; 

  while (!fin.eof())
{ fin>>test.x;
fin>>test.y;
fin>>test.z; test_list.push_back(test); } fin.close();

在运行时 发现  test_list中的数据比文本中的数据多一行,也就是 文本中最后一行的数据写了两遍

始终无法理解

现在明白了:》

再读完最后一行后,

因为fin.eof()仍为假, 所以会继续while循环

当执行到while的第一个语句   fin>>test.x时,发现无可读数据了,此时修改流属性,fin.eof ()变为TRUE

再执行   fin>>test.y; fin>>test.z;时,因为已经到文件末尾了 ,所以 test保留了上次的值,也即test中的值为变,还是文本最后一行

的数据

此时再push_back(test),压入列表的仍是最后一行数据

由此导致了,列表中的数据比文本中的数据多一行

---------------------

知道了原因 ,便很好作出修改了

修改为:

  while (  fin>>test.x&&fin>>test.y&& fin>>test.z)
{ test_list.push_back(test); } fin.close();

这样便没问题了 ,当读取完最后一行数据后,将其放入列表中,此时判断while条件,也就是再次读取数据,发现无数据可读,读取不成功 fin>>test.x返回False 由此结束循环。

参考资料:

http://zhidao.baidu.com/question/121339522.html?fr=im

http://topic.csdn.net/u/20091014/12/4182ffd1-055c-490e-bfc5-9b82a9004144.html?seed=588522249&r=60404137#r_60404137

转载 - C++ - 关于ifstream/fstream流 判断文件是否结束eof()的问题的更多相关文章

  1. 使用feof()函数判断文件是否结束

    课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理.) while(!feof(fp)) { ch=fgetc(fp); putchar(ch); } 但是,这样写的话,fgetc ...

  2. python中readline判断文件读取结束的方法

    注:内容来自网络 本文实例讲述了python中readline判断文件读取结束的方法.分享给大家供大家参考.具体分析如下: 大家知道,python中按行读取文件可以使用readline函数,下面现介绍 ...

  3. ifstream 流 判断文件是否结尾的函数eof(.xml

    pre{ line-height:1; color:#800080; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-wei ...

  4. C#根据文件流判断文件类型

    判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...

  5. java根据文件流判断文件类型(后缀名)

    import java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] ...

  6. python中文件处理--判断文件读取结束方法

    一.readline函数 按行遍历读取文件的方法,通过这个方法,readline() 每次只读取一行,通常比 .readlines() 慢得多.仅当没有足够内存可以一次读取整个文件时,才应该使用 .r ...

  7. 【转载】C++文件读写详解(ofstream,ifstream,fstream)

    原文:http://blog.csdn.net/kingstar158/article/details/6859379 在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,f ...

  8. fstream 中判断是否成功打开文件

    from: http://blog.csdn.NET/zhtsuc/article/details/2938614 关于C++ fstream的一个容易使用出错的地方 关于c++ 中 文件流的两个类, ...

  9. C++读写文件ofstream,ifstream,fstream)[转]

    在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容:[ ...

随机推荐

  1. Linux C编程之一:Linux下c语言的开发环境

    ---恢复内容开始--- 今天开始根据Linux C编程相关视频的学习所做的笔记,希望能一直坚持下去... 1.开发环境的构成 编辑器:VI: 编译器:选择GNU  C/C++编译器gcc: 调试器: ...

  2. hadoop2.x 常用端口及定义方法

    一 常用端口号 1 HDFS 2 YARN 3 HBase 4 Hive 5 ZooKeeper 二 Web UIHTTP服务 1 对于存在 Web UIHTTP服务的所有 hadoop daemon ...

  3. object-c中实现特定一个或者多个页面横竖屏,其他界面保持竖屏显示。

    1.首先设置项目支持的屏幕方向.info.plist设置(自行设置) 2.写一个子类CusNavigationController 继承 UINavigationController,在CusNavi ...

  4. Microsoft SQL Server学习(四)--约束

    SQLServer - 约束 主要是为了保证数据库中的数据一致性.有效性.准确性, 从而提高了数据库中数据的正确性 一.约束的分类 在SQLserver中,约束分三种不同类型 1.实体约束 实提约束是 ...

  5. Server 2008 R2 事件查看器实现日志分析

    在 windows server 2008 R2 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...

  6. POJ_3041_Asteroids

    参考自: http://user.qzone.qq.com/289065406/blog/1299322465 解题思路: 把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1.V2,其中| V1 ...

  7. 搭建jQuery开发环境

    每个版本又分为一下两种:开发版和生产版: 版本 大小/KB 描述jquery-1.x.js 约288 开发版,完整无压缩,多用于学习,开发和测试jquery-2.x.js 约251 开发版,完整无压缩 ...

  8. Jmeter之JDBC请求参数化(二)

    二.上面已经讲了一些基本的配置,和简单的jdbc请求,下面来看下具体的如何将查询语句参数化. 参数化这里有几种方法,foreach,计数器,csv等,这里介绍几种方法.

  9. 观察者模式在Foundation框架通知中的应用

    GitHub传送门 1.何为观察者模式? 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 举个简单的例子:你和你的舍友都订阅了 ...

  10. 日常开发需要掌握的Maven知识

    文章来自:https://www.jianshu.com/p/e224a6dc8f20和https://www.jianshu.com/p/20b39ab6a88c Maven出现之前 jar包默认都 ...