C++ EOF问题

eof()这个函数本意是用于方便大家在读取文件使方便判断文件尾的位置,当时由于大多数人对其原理不是很了解,所以使用时经常会出现各种错误。
看下面这段代码~
#include <bits/stdc++.h>
using namespace std;
int main()
{
	ifstream fin("test.txt");
	char ch;
	bool flag;
	while(!fin.eof())
	{
	    flag = fin.eof();
		ch = 'X';
		fin>>ch;
		flag = fin.eof();
		cout << ch;
	}
    return 0;
}
如果有一个文件,其中的内容只为abcd,会输出什么呢?
是abcd吗?
       很遗憾,当然不是~(●'◡'●) 如果有不相信的同学,可以自己去试一试~ 偷笑

那么是什么地方出现问题了呢?
       我们来思考一个问题,什么时候EOF会返回true,常说的读到文件尾有时根据什么判断的呢?有人说是读取了文件结束符,我认为这个想法是不准确的。我分别在读取最后一个字符前后,查看了eof()函数的返回值,发现依旧是false,而且下一个字符也没有任何数据读进来。也就是说,文件尾并不是根据一个文件里确切存在的字符判断的。

那EOF是怎么产生的呢?
我觉的有一个朋友的说法比较合理,“ EOF是流的状态标志。在 C++中,是在读取文件失败时才产生EOF。”
来自http://blog.csdn.net/zhy10/article/details/1562649
也就是eof()本身并不读取字符,而是依靠输入流的返回,所以在读入最后一个字符的下一次读取的时候会产生EOF,于是eof()开始返回true。

解决办法:
上面那篇文章中已经提到了几种解决办法,通过判断文件指针的位置距离文件首是否等于文件长度,或是使用peek()这个预读函数。
我在这里再提一种我的解决办法,也就是利用读入函数的返回值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
	ifstream fin("test.txt");
	char ch;
	bool flag;
	while(fin>>ch)
	{
	    flag = fin.eof();
		flag = fin.eof();
		cout << ch;
	}
    return 0;
}
这样也可以解决上述存在的问题了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值