博客
关于我
c++ eof()
阅读量:797 次
发布时间:2023-03-25

本文共 1093 字,大约阅读时间需要 3 分钟。

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中的数据比文本中的数据多一行,也就是文本中最后一行的数据写了两遍。

最终找到了一个解决方法,现在把上面的代码改为如下:

#include

#include <stdlib.h> #include

int main() { char c = 'c'; ifstream FILE("test.txt"); if(FILE.peek() == EOF) { cout<<"文件是空的"<<endl; exit(1); } while(FILE.peek() != EOF) { FILE.get(c); cout<<c; } system("pause"); return 0; }

主要是把eof()改为peek() == EOF来判别,其中peek()是取文件当前指针,EOF是文件尾尾标符,它的值为-1,所以采用这种方法就解决上面 eof()的问题了。这种方法也可以用在读写二进制文件中。

文章出处: 转载于:https://www.cnblogs.com/imoon/archive/2012/10/06/2712716.html

你可能感兴趣的文章
Objective-C实现原型模式(附完整源码)
查看>>
Objective-C实现双向A*算法(附完整源码)
查看>>
Objective-C实现双向广度优先搜索算法(附完整源码)
查看>>
Objective-C实现双向循环链表(附完整源码)
查看>>
Objective-C实现双向链表(附完整源码)
查看>>
Objective-C实现双端队列算法(附完整源码)
查看>>
Objective-C实现双线性插值(附完整源码)
查看>>
Objective-C实现双重链表(附完整源码)
查看>>
Objective-C实现反向传播神经网络算法(附完整源码)
查看>>
Objective-C实现反转位算法(附完整源码)
查看>>
Objective-C实现反转字符串算法(附完整源码)
查看>>
Objective-C实现合并两棵二叉树算法(附完整源码)
查看>>
Objective-C实现后缀表达式(附完整源码)
查看>>
Objective-C实现向量叉乘(附完整源码)
查看>>
Objective-C实现哈希查找(附完整源码)
查看>>
Objective-C实现哈希表算法(附完整源码)
查看>>
Objective-C实现哥德巴赫猜想(附完整源码)
查看>>
Objective-C实现唯一路径问题的动态编程方法的算法(附完整源码)
查看>>
Objective-C实现唯一路径问题的回溯方法的算法(附完整源码)
查看>>
Objective-C实现四舍五入(附完整源码)
查看>>