最近写了些代码,在对文件的操作中发现了很经典的EOF问题,呵呵。
EOF,即end of file,文件结尾,作为文件结束的标志,在程序中常作为判断的一个标志。但在我们平常的程序中却常发生意想不到的结果。
下面这段程序,猜猜它输出的是什么?
char c;
ifstream fin("d://dat");//设d:/dat文件已存在,内容为ab。
while(!fin.eof())
{
    fin >> c;
    cout << c;
}
输出结果是abb,没想到吗?你可能会问,再输出第一个b的时候,文件指针已经指向了EOF,为何不结束?
问题的关键是文件EOF机制是怎样运作的。

我们来谈三个问题:

1、文件指针
当打开一个文件时,文件指针位置为0,并不是指向第一个字符,即第一个字符的位置为1。这一点我们可以通过peek()函数验证。peek()返回的是当前文件指针下一个位置的字符。所以有:
ofstream fo("d://dat");
fo << 'h';
fo.close();
ifstream fi("d://dat");
char temp = fi.peek();
cout << temp;
会显示h。
还有,用fo.seekp(0,ios::beg),得文件指针为0;fo.seekp(0,ios::end),得文件指针指向最后一个字符。

2、关于EOF
很多朋友认为文件尾有EOF,这是错误的。EOF是流的状态标志。在 C++中,是在读取文件失败时才产生EOF。所以第一个程序中,在输出第一个b时,产生了EOF,再输出第二个b时读取到EOF,循环结束。

3、解决EOF困惑的办法
我感觉在判断文件结束上,最好的方法就是判断文件指针相对于开头的位置,是否等于文件长度。即:
long filelen;
ifstream fin("d://dat");//设d:/dat文件已存在,内容为ab。
fin.seekg(0,ios::end);
filelen = fin.tellg();//获取文件长度
fin.seekg(0,ios::beg);
while (1)
{
    if (filelen == fin.tellg())//到达文件尾,即指向EOF
    {
        flag = true;
        break;
    }
    读取数据...
}

当然还有别的方法,就是用peek()的预读性。
peek()返回当前文件指针下一个位置的字符,而指针位置不变。所以我们可以这样:
while (fi.peel()!=EOF)
{
    ...
}
当while循环体中,文件指针指向最后一个字符,若没有fi.peel()!=EOF,则需要再下一个循环中才能触发EOF。而加了fi.peel()!=EOF后,用预读的方法检测出了EOF。呵呵,这个方法挺好的吧!

关于EOF(文件结束符)问题的体会相关推荐

  1. MacOX以及XCode下文件结束符(EOF)的输入

    在Windows下我们可以通过ctrl+Z来输入文件结束符(EOF),而在MacOS下,EOF的可以通过control + D来输入.这里指的是在终端下可以这样输入.如果在写C程序类似: while ...

  2. OJ 题目要求直到 碰到文件结束符(EOF)才结束输入 的用法。JAVA C

    在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file).在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件.在文本文件中,数据都是 ...

  3. java 文件结束符 eof_文件结束符EOF .

    >> 关于文件结束符EOF EOF 是 End Of File 的缩写. 在C语言中,它是在标准库中定义的一个宏. 人们经常误认为EOF 是从文件中读取的一个字符(牢记).其实,EOF 不 ...

  4. python语句结束符_python中判断文件结束符的具体方法

    python中判断文件结束符的方法:可以使用try except语句块来进行判断. 具体使用方法:[try:while True:s = input() except EOFError: pass]. ...

  5. 用文件结束符(Ctrl+Z)结束元素输入时不要忘记将流cin恢复为有效状态

    有这样一个题目: 通过标准输入给两个int型vector对象赋值. 一开始,我的程序是这样的: <pre name="code" class="cpp"& ...

  6. 内核中设置文件结束符_Linux 日志文件系统原来是这样工作的

    文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata) ...

  7. 转:C++读取EOF文件

    文章出处:http://blog.chinaunix.net/uid-27034868-id-3758629.html 对于文本文件,当我们使用eof()判断文件是否结束时会多读一次(c语言也有类似的 ...

  8. 文件比对工具对比两种数据的差距

    项目开发中,需要比对两个文本有什么不同,需要比对两个文本的不同,可以使用工具Beyond compose 官方的下载地址: https://www.beyondcomparepro.com/downl ...

  9. 资料结束符EOF,system(quot;stty rawquot;)

    文件结束符EOF,system(stty raw) 关于文件结束符EOFEOF 是 End Of File 的缩写.在C语言中,它是在标准 文件结束符EOF,system("stty raw ...

最新文章

  1. 90后清华女校友范楚楚获ACM 2020唯一博士论文奖!出任MIT助理教授后再摘桂冠
  2. .Net Micro Framework研究—绘图
  3. Java设计模式(8)组合模式(Composite模式)
  4. 【树形DP】没有上司的晚会 (ssl 1607)
  5. java后台 flex前台例子_flex+blazeds+java后台消息推送(简单示例)
  6. Windows下编译sqlite3
  7. php自动填表单,网页自动填表基础教程从简单开始
  8. Wifi 破解原理及教程
  9. 学期学会的一些代码23333原创
  10. 栋的月结 | 第三回合(定期更新、动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇)[含泪总结.. 憋泪分享!]
  11. led灯条串联图_一种串联控制LED灯条的制作方法
  12. word中硬回车(enter)与软回车(shift+enter)
  13. 本地html如何封装成app,新手适用:如何把网页快速封装成APP
  14. libc、glibc和glib的关系
  15. 搭建微信小程序HTTPS服务器
  16. 《雷军:我向阿里学到了三点,这是创业成功的核心》有感
  17. IPFS 之包管理器GX
  18. 存储与虚拟主机管理,克隆虚拟机的详细讲解
  19. ansible的变量和机密
  20. nba2k14mod android,nba2k14安卓mod

热门文章

  1. 读书笔记:《为什么大猩猩比专家高明, How We Decide》
  2. Django-MVC及MTV设计模式:
  3. 分享 8k-16k-单通道-16bit WAV音频 样本数据
  4. 印刷工艺- 喷墨印刷
  5. 2014 android 机型排行,2014年1月份10大畅销Android智能手机排名(图)
  6. VBA,excel中选择特定内容复制粘贴
  7. oracle查看外键约束哪个字段,oracle 查看主外键约束(转)
  8. CSS高级技巧:精灵图、字体图标、三角形制作、布局技巧
  9. 财路网每日原创推送:通证和代币
  10. python 网易公开课官网_哪里有python视频教程全集下载?