C++之EOF()
fstream流的eof()推断有点不合常理
按常理逻辑来说,假设到了文件末尾的话,eof()应该返回真,可是,C++输入输出流怎样知道是否到末尾了呢?
原来依据的是:假设fin>>不能再读入数据了,才发现到了文件结尾,这时才给流设定文件结尾的标志,此后调用eof()时,才返回真。
如果
find>>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;
whlie( !fin.eof() )
{
fin>>test.x;
fin>>test.y;
fin>>test.z;
test_list.push_back(test);
}
fin.close();
在执行时,发现test_list中的数据比文本中的数据多一行,也就是文本中最后一行的数据写了两遍。
终于找到了一个解决方法,如今把上面的代码改为例如以下:
#include <iostream>
#include <stdlib.h>
#include <fstream>
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()的问题了。这样的方法也能够用在读写二进制文件里。
文章出处:http://blog.csdn.net/shuilan0066/archive/2009/10/14/4669451.aspx
http://hi.baidu.com/cdever/blog/item/549cb01f1fc0eecca7866985.html
C++之EOF()的更多相关文章
- linux下EOF写法梳理
在平时的运维工作中,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容.如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢 ...
- php定界符<<<EOF讲解(转)
Heredoc技术.可用来输出大段的html和javascript脚本 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西: 2.在PHP定界符中的任何特殊字符都不需要转义: ...
- while(cin.eof)出错 poj
zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...
- c++ eof()函数
C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...
- 【转】 解读EOF
解读EOF 标签: fplinuxc语言filestream 2012-01-31 22:05 439人阅读 评论(0) 收藏 举报 分类: C.C++_程序设计(20) 我学习C语言的时候,遇到 ...
- Linux C 字符函数 getchar()、putchar() 与 EOF 详解
首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getc ...
- Ext3文件系统mount选项和文件属性介绍
mount选项 设置方式 ext3 mount选项可以通过多个方式进行设置:1)内核编译时: 内核menuconfig通过CONFIG_EXT3_DEFAULTS_TO_ORDERED编译控制选项,来 ...
- .NET 串口通信中断接收,包含0X1A(作为EOF)
.NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...
- 常见的getchar 与EOF的问题
代码中常有类似的如下的输入循环 char c; while((c=getchar())!=EOF).... 如果输入 字符+换行时,循环的代码会执行两次,主要是换行键作为字符存到了缓存队列中,第一次 ...
- PHP eof的使用
PHP eof的使用 也就是heredoc技术,来部分实现界面与代码的分离 <?php $name = '张三'; print <<<EOT <html> < ...
随机推荐
- Minimax Triangulation
题意: 按顺序给定一些点,把这些点分割为n - 2个三角形,花费为最大三角形面积,求最小花费 分析: 区间dp,dp[i][j]表示完成区间[i,j]最小花费,dp[i][j]=min(dp[i][j ...
- HDU 5750 Dertouzos 简单数学
感悟:这又是zimpha巨出的一场题,然后04成功fst(也就是这题) 实际上还是too young,要努力增加姿势, 分析:直接枚举这些数不好枚举,换一个角度,枚举x*d,也就是d的另一个乘数是多少 ...
- SDUT 3571 Password 暴力搜索
这个题如果裸搜肯定超时了 但是我们可以枚举,用初始串的哪一位数字去填目标串的那一位数字 这样就是暴力6!,复杂度很低,然后需要解决过程中经过的点的问题, 因为是从左向右走,所以记录当前光标, 和当前达 ...
- Linux基本命令(2)有关磁盘空间的命令
有关磁盘空间的命令 命令 功能 mount 挂载文件系统 umount 卸载已挂载上的文件系统 df 检查各个硬盘分区和已挂上来的文件系统的磁盘空间 du 显示文件目录和大小 fsck 主要是检查和修 ...
- Sql中判断“数据库"、"表"、"临时表"、"存储过程"和列”是否存在
--判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER..sysdatabases WHERE NAME = ''库名'') PRINT ''exists ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
- 去除下载电影和电视剧文件名中的多余字符[python实现]
讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),,搞得文件名好长,可以使用下面的Python代码,自行修改即可. #!\usr\bin\env python # -*- coding: u ...
- 一起刷LeetCode4-Median of Two Sorted Arrays
实验室太吵了...怎么办啊... ----------------------------------------------------------------------------------- ...
- JAVA——利用wait和notify实现生产者和消费者
经典的消费者和生产者的的实现: 注意事项: 1:在循环里面用wait(),因为当线程获得了锁,但是有可能还没有满足其他条件: 2:公用的缓冲池要用锁机制: package demo; import j ...
- 防asp木马运行
首 页 > 技术支持 防asp木马运行 目前比较流行的ASP木马主要通过三种技术来进行对服务器的相关操作. 一.使用FileSystemObject组件 FileSystemObject可以对文 ...