出处: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. P1266 速度限制(分层图spfa)

    P1266 速度限制 题目描述 在这个繁忙的社会中,我们往往不再去选择最短的道路,而是选择最快的路线.开车时每条道路的限速成为最关键的问题.不幸的是,有一些限速的标志丢失了,因此你无法得知应该开多快. ...

  2. 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 在一个遥远 ...

  3. (博弈论)51NOD 1069 Nim游戏

    有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量,问最后 ...

  4. /usr/lib64/python2.6/lib-dynload/pyexpat.so: symbol XML_SetHashSalt, version EXPAT_2_0_1_RH not defined in file libexpat.so.1 with link time reference

    解决方法:[root]$cd /usr/lib64/python2.6/lib-dynload[root]$ln -s /lib64/libexpat.so.1.5.2 libexpat.so.0[r ...

  5. c语言 error C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name

    问题: 在使用visual studio 2013,进行调试执行代码时,出现如下错误: error C4996: 'strupr': The POSIX name for this item is d ...

  6. ASP.Net 知识点总结(四)

    1.get和post 的区别 get是从服务器上获取数据,post是向服务器传送数据; get安全性非常低,数据显示在地址栏,post安全性较高: 但是执行效率却比Post方法好: get有字节限制为 ...

  7. [ NOI 2002 ] 银河英雄传说

    \(\\\) Description 有 \(n\) 列战场,每一列一开始只有一个战舰,编号就是对应的战场编号. 有 \(m\) 次操作: \(M_{i,j}\) :把 \(i\) 所在的一整列接在 ...

  8. PHP开发心得二

    如何解决错误:PHP SOAP Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML documen ...

  9. 【笔记JS/HTML/CSS】用div实现个性化button,背景半透明

    html中的button默认样式..不太能看,如果调一调背景色和字体的话也挺适合简洁的页面设计 于是决定配合JS,用html中的div完成button 最终结果图: html代码:(first_pas ...

  10. 梦想MxWeb3D协同设计平台 2019.02.28更新

    梦想MxWeb3D协同设计平台 2019.02.28更新 SDK开发包下载地址: http://www.mxdraw.com/ndetail_10130.html 在线演示网址: http://www ...