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()的更多相关文章

  1. linux下EOF写法梳理

    在平时的运维工作中,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容.如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢 ...

  2. php定界符<<<EOF讲解(转)

    Heredoc技术.可用来输出大段的html和javascript脚本 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西: 2.在PHP定界符中的任何特殊字符都不需要转义:  ...

  3. while(cin.eof)出错 poj

    zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...

  4. c++ eof()函数

    C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...

  5. 【转】 解读EOF

    解读EOF 标签: fplinuxc语言filestream 2012-01-31 22:05 439人阅读 评论(0) 收藏 举报  分类: C.C++_程序设计(20)  我学习C语言的时候,遇到 ...

  6. Linux C 字符函数 getchar()、putchar() 与 EOF 详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getc ...

  7. Ext3文件系统mount选项和文件属性介绍

    mount选项 设置方式 ext3 mount选项可以通过多个方式进行设置:1)内核编译时: 内核menuconfig通过CONFIG_EXT3_DEFAULTS_TO_ORDERED编译控制选项,来 ...

  8. .NET 串口通信中断接收,包含0X1A(作为EOF)

    .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...

  9. 常见的getchar 与EOF的问题

    代码中常有类似的如下的输入循环 char  c; while((c=getchar())!=EOF).... 如果输入 字符+换行时,循环的代码会执行两次,主要是换行键作为字符存到了缓存队列中,第一次 ...

  10. PHP eof的使用

    PHP eof的使用 也就是heredoc技术,来部分实现界面与代码的分离 <?php $name = '张三'; print <<<EOT <html> < ...

随机推荐

  1. [Everyday Mathematics]20150121

    设 $f\in C[0,1]$ 适合 $$\bex xf(y)+yf(x)\leq 1,\quad\forall\ x,y\in [0,1]. \eex$$ 试证: $$\bex \int_0^1 f ...

  2. JS:实用功能

    ylbtech-jQuery:函数-导航 添加样式(addClass).移除样式(removeClass) 轮替函数(toggle()) 选项拼加 全选 网页刷点器 jQuery:3.1,添加样式(a ...

  3. Android 中屏幕点击事件的实现

    在Android中如何用代码触发按钮点击事件?我想要触发代码执行按钮点击.实现对于单击按钮事件的模拟,触发单击按钮进入另一个界面. 就是声明一下什么moonlightcheese被声明了:在andro ...

  4. 转载:Hadoop权威指南学习笔记

    转自:http://pieux.github.io/blog/2013-05-08-learn-hadoop-the-definitive-guide.html 1 前言 Hadoop的内部工作机制: ...

  5. 【Mongo】Linux安装MongoDB

    呵呵哒,每天都是小惊喜. 一 下载 https://www.mongodb.org/downloads可进行下载,根据需要选择合适的版本和操作系统 二 上传服务器 1 上传服务器路径并解压 2 创建数 ...

  6. 【Python】python读取文件操作mysql

    尾大不掉,前阵子做检索测试时,总是因为需要业务端操作db和一些其他服务,这就使得检索测试对环境和数据依赖性特别高,极大提高了测试成本. Mock服务和mysql可以很好的解决这个问题,所以那阵子做了两 ...

  7. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  8. andriod的简单用法1

    1.从一个Activity跳转到另一个Activity,使用Intent. 在按钮的onClick中如下写法: public void Login(View view) { Intent intent ...

  9. Cloudera 建议使用 NTP 使 Hadoop 群集实现时间同步

    主机的 NTP 服务未响应时钟偏差请求. 建议 这是主机运行状况测试,用于检查主机的系统时钟是否与其 NTP 服务器不同步.该测试能检查“ntpdc -c loopinfo”命令报告的主机时钟偏差绝对 ...

  10. CentOS6 root 用户 vi/vim 无法开启高亮

    编辑 /etc/profile.d/vim.sh if [ -n "$BASH_VERSION" -o -n "$KSH_VERSION" -o -n &quo ...