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

出处: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

以下例子:

 1  ifstream fin("D://line.txt");
 2
 3  ofstream fout("D://T_line.txt",ios::trunc);
 4
 5
 6  list<tag_Point> test_list;
 7
 8  tag_Point test;
 9
10
11
12  while (!fin.eof())
13  {
14
15
16
17   fin>>test.x;
18   fin>>test.y;
19   fin>>test.z;
20
21
22
23
24   test_list.push_back(test);
25
26
27  }
28
29    fin.close();
30
31    

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

始终无法理解

现在明白了:》

再读完最后一行后,

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

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

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

的数据

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

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

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

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

修改为:

 1  while (  fin>>test.x&&fin>>test.y&& fin>>test.z)
 2  {
 3
 4
 5   test_list.push_back(test);
 6
 7
 8  }
 9
10    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

时间: 2024-11-05 15:50:27

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

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

pre{ line-height:1; color:#800080; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;} .selfFuc{color:#800080;} .bool{color:#d2576f;} .condition{color:#000080;font-weight:bold;} .key{color:#000080;} .var{color:#800000;font-sty

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

判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static bool IsAllowedExtension(string filePa

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

import java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) {

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

from: http://blog.csdn.NET/zhtsuc/article/details/2938614 关于C++ fstream的一个容易使用出错的地方 关于c++ 中 文件流的两个类,ifstream 和ofstream,大家也许并不陌生. 其负责c++的文件输入流 和 文件输出流.基本上所以语言都会提供类似的文件输入流 和文件输出流类. 但当大家学习了Java,或者c#后,大家就很容易用错这个类,把三种语言混淆. 在java 和 c#中,关于打开输入文件流,或者输出流,都是通过

C++文件读写详解(ofstream,ifstream,fstream)

c++bufferiosiostreamfilestream 目录(?)[+] 在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view plaincopyprint? #include <fstream> ofstream         //文件写操作 内存写入存储设备 ifstream         //文件读操作,存储设

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

在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容:[java] view plain copy print?#include <fstream>  ofstream         //文件写操作 内存写入存储设备   ifstream         //文件读操作,存储设备读区到内存中  fstream          //读写操作,对打开的

(转载)java基础:关于java流与文件操作

原文摘自: http://www.blogjava.net/haizhige/archive/2008/08/03/219668.html 1.描述:流是字节数据或字符数据序列. Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序流向终点的管道,程序通过该管道把数据写到终点.所有的关于输入/输出的类都包含在java.io的包中.2.File类:它主要关心的是文件的具体属性,而非内容,定

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

转:http://blog.csdn.net/kingstar158/article/details/6859379 摘要:具体用法,上面链接中,文章写的很详细,讲解ofstream,ifstream,fstream,很清楚.

shell判断文件,目录是否存在或者具有权限 (转载)

转自:http://cqfish.blog.51cto.com/622299/187188 文章来源:http://hi.baidu.com/haigang/blog/item/e5f582262d639c118b82a167.html #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" #这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x &