看下面一段代码:

ofstream ofs("a.txt");
int n = 1;
while (--n) {     //不进入循环体
  ofs<<n<<"\t";
}
ofs.close();
int  x=5,z = 0;
ifstream ifs("a.txt");
 while (!ifs.eof()) 
{
cout<<ifs.eofbit<<endl;     //输出1
        x=ifs.get(); -------------》》输出-1,此时ifs指向文件结束符,所以若直接用get()取出,则会出错,出错的表示形式就是输出为-1,所以这个-1表示的是这是一个表示文件结束符,没有其他的数值含义。
 //    ifs>>x;   ----------------》》 输出为5,这种写法与x=ifs.get()不同,在这种形式下,ifs指向文件结束符,所以ifs并没有实际的值,将ifs文件流取到的值赋给x,因为ifs没有值,所以此时x保持不变。
       ++z; 
       cout<<x<<"\t"<<flush; 

ifs.close();

可知此时由于n=1,导致a.txt是空的,但是在从a.txt读时,首先判断ifs是否为EOF,程序这时进入循环,说明不是EOF,并读出此时eofbit为1(true),输出读取的值。然后再从新判断ifs是EOF,退出循环。

--------------》》在文件流中有一个eofbit值,初始化为true,在调用eof()函数进行EOF判断时,就是根据这个eofbit的值来判断的。所以在文件为空时,调用eof(),判断eofbit,此时为true,所以进入循环;此时读取的-1表示文件结束符。在读到这个文件描述符-1之后,文件流类中的eofbit就会置为false(它会辨别是文件里面的数值-1还是文件结束符的-1),再次进入循环判断eof()就会判断EOF,退出循环。----------》》eofbit的值初始化为true,根据读取到的东西判断是否为false,所以在程序进行到读取文件结束符时,eofbit事先不知道这个是文件结束符,只有在读了这个结束符之后才知道已经到文件末尾,并将eofbit置为false。因此,若要判断eof()函数是否为true(即是否到达文件结束),需要先读文件结束符。

再看下面一段代码:

ofstream ofs("a.txt");
int n = 10;
while (--n) {
  ofs<<n<<"\t";             //写入9 8 7 6 5 4 3  1
}
ofs.close();
int  x=0,z = 0;
ifstream ifs("a.txt");
 while (!ifs.eof()) 
{
        ifs>>x;           
        ++z;               
cout<<x<<"\t"<<flush;   // 输出9 8 7 6 5 4 3 2 1 1
}                               
ifs.close();

由以上的分析可知,当读到a.txt中的最后一个数1时,eofbit是true,将1赋值给x,并输出,再次循环, 此时还未读文件结束符,因此eofbit是true,进入循环体,ifs>>x表示将文件流取到的值赋给x,此时 文件流读取到的是文件结束符,eofbit置为false,此时文件流的值不存在,所以 x保持不变,还是上次的1,因此继续输出1。再次循环,此时eofbit是false,所以eof()返回true,跳出循环。于是最终就得到输出时多了一个1的情况。

因此,平时在判断文件是否结束使用到eof()函数时,需要注意到是先读文件结束符,eofbit才能置为false,eof()函数才会返回true。所以,在使用时,为了避免错误的情况,可以这样使用:

while (true
ifs>>x;  
if(ifs.eof()) break;  //先读,读了之后再检测   
++z;              
cout <<x <<"\t" <<flush; 

或者使用   ifs.peek() != EOF   或   ifs.get(ch) != NULL 或 (ch=ifs.get()) != EOF 的条件

如:

while (ifs.get(ch)!=NULL
       
++z;              
cout <<ch <<"\t" <<flush; 

判断文件结束的几种方法和eof()函数相关推荐

  1. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  2. Java创建数组的三种方法和ArrayList的用法

    Java创建数组的三种方法和ArrayList的用法 Java创建数组的三种方法 一.声明并赋值 二.声明数组名开辟空间 三.声明数组并指定元素个数 四.多维数组 ArrayList的用法 一.添加元 ...

  3. [转载] python 字符串查找的4个方法和count函数

    参考链接: Python字符串 count 方法 python 字符串查找的4个方法和count函数 所谓的字符串查找方法就是查找子串在字符串中的位置和出现的次数 python 字符串查找有4个方法, ...

  4. java判断文件结束_关于java读取文件时,如何判断读取文件是否到达末尾?

    一.前言 java读取文件时,如果到达文件末尾,再进行读取时会发生异常,所以我们需要判断读取文件已经到达末尾.对于文件读取我们通常会采用不同的读取方式,如用InputStream流读取字节流.用Rea ...

  5. 【本科研究生】论文选题的 4 种方法和 5 条判断标准

    ​​选题的定义 按照一般的理解,包括一些官方的.权威的字典上.词典上,以及教科书中对选题的界定,选题是(选择)所要研究的课题.方向或问题. 在这里,给大家推荐一种我所提倡的对选题的理解:我们对选题的理 ...

  6. 使用feof()判断文件结束时会多输出内容的原因

    这是原来的代码: #include <stdio.h> int main() {     FILE * fp;     int ch;     fp = fopen("d:\\a ...

  7. 撤销前进快捷键_ps怎么撤销的三种方法和ps撤销快捷键以及连续撤销多步快捷键...

    内容提要:文章综合介绍ps撤销快捷键相关的一些操作,包括PS怎么撤销.PS撤销多步.ps连续撤销快捷键.历史记录面板操作等等. 关于ps怎么撤销操作,有多种方法:使用PS撤销快捷键.编辑菜单.文件菜单 ...

  8. IOS中获取各个文件的目录路径的方法和NSFileManager类

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...

  9. python中统计计数的几种方法和Counter的介绍

    1使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b', ...

最新文章

  1. 01. 把存储过程结果集SELECT INTO到临时表
  2. 01-插件推荐:RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
  3. Web Api如何传递POST请求
  4. 科学价值 社交关系 大数据_服务的价值:数据科学和用户体验研究美好生活
  5. OpenGL模板测试通俗理解
  6. matlab如何使音频文件声音变大_如何用录音软件AU2020给音频消除噪音?只需简单几步你也可以办到...
  7. 用户与计算机系统的交互换界面,人机交互期末PPT复习(GXNU李智老师)
  8. android 打包成多个so,Android Studio打包.so库到apk中实例详解
  9. “差不多先生”姚劲波和不再神奇的58同城
  10. 几种镜像恒流源电路分析!
  11. 苹果电脑的计算机系统在哪里,苹果电脑切换系统按哪个键【方法介绍】
  12. C语言,switch语句系列
  13. 如何培养孩子的阅读兴趣
  14. 移植boa服务器和错误指南
  15. ua识别(浏览器标识识别)
  16. 组合问题,用1元纸币兑换1分,2分和5分硬币,要求兑换总数为50枚,问组合方式多少种?
  17. c语言识别按了esc键_c语言输入esc
  18. 如何在 2021 年使用 WordPress 制作游戏网站
  19. IM SDK websocket chart room
  20. 即便您是个跑龙套的甲乙丙丁,也该认真对待您自个的角色

热门文章

  1. python如何合并excel文件
  2. 机器学习——Kmeans聚类算法
  3. android按钮中添加图标,android 控件 带图标的按钮(ImageButton)
  4. Android 项目必备(四十三)-->Android 开发者的 new 电脑
  5. office下载与安装
  6. python cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library
  7. 再见2017,你好2018
  8. String.intern() 的详细理解
  9. 响应式网页《一起惠返利网》项目要点
  10. Pspice仿真出错汇总