网站建设的推广渠道,长沙建站标协助找有为太极,注册了域名之后如何建立一个网站,企业查询天眼查入口用ifstream的eof()#xff0c;竟然读到文件最后了#xff0c;判断eof还为false。网上查找资料后#xff0c;终于解决这个问题。 参照文件#xff1a;http://tuhao.blogbus.com/logs/21306687.html 在使用C/C读文件的时候#xff0c;一定都使用过eof#xff08;#xff0…用ifstream的eof()竟然读到文件最后了判断eof还为false。网上查找资料后终于解决这个问题。 参照文件http://tuhao.blogbus.com/logs/21306687.html 在使用C/C读文件的时候一定都使用过eof这个函数来判断文件是否为空或者是否读到文件结尾了也会在使用这个函数的过程中遇到一些问题如不能准确的判断是否为空或者是否到了文件尾以至于有些人可能还会怀疑这个函数是不是本身在设计上就有问题。 先来看看如下这段代码 #include iostream#include fstreamusing namespace std;int main(){ char ch x; ifstream fin(test.txt /*, ios::binary*/); if (fin.eof()) { cout file is empty.endl; return 0; } while (!fin.eof()) { fin.get(ch); cout ch; } system(pause); return 0;} 编译并运行以上代码 如果test.txt不存在程序会形成死循环fin.eof()永远返回false如果test.txt为空程序打印出一个x字符当test.txt中存在一字符串“abcd”且没有换行时程序打印出“abcdd”当存在以上字符串并且有一新的空行时程序打印出“abcd”加上一空行。这种现象可能让很多人很迷惑程序运行的结果似乎很不稳定时对时错。使用binary模式读时结果一样。在这里大家可能有一个误区认为eof返回true时是读到文件的最后一个字符其实不然eof返回true时是读到文件结束符0xFF而文件结束符是最后一个字符的下一个字符。如下图所示 因此当读到最后一个字符时程序会多读一次编译器会让指针停留在最后一个字符那里然后重复读取一次这也就是就上面最后一个字符会输出两次的原因。至于是不是所有的编译器都这样处理我就不太清楚了我使用的VC6VC8似乎都是这样的 问题出来了就要找出对应的解决之道要解决以上的问题只需要调整一下条件语句即可 fin.peek() EOF 或 fin.get(ch) 再来看一下另外一种情况 #include iostream#include fstream#include stringusing namespace std;int main(){ string str; ifstream fin(test.txt/*, ios::binary*/); if (fin.peek() EOF) { cout file is empty.endl; return 0; } while (!fin.eof()) { fin str; cout str; } system(pause); return 0;} 上述代码在VC8下编译运行发现当文件结尾没有空行时结果正确当结尾有空行时最后一个字符串将被重复输出一次 而VC6的情况则有所不同没有重复输出但输出了一个空行。 因此为了保证在不同的编译器下得到一致的我们期望的结果将条件语句做一下修改 fin str 综上所述我们可以得到以下结论1. 判断文件是否为空时使用peek函数若peek返回EOF则文件为空2. 读取文件过程中读取非char型时使用peek判断文件尾将不再适用循环判断条件应改用操作符进行读取若读入char型缓冲区peek函数会表现得很好。 peek() —— 此函数将返回输入流文件的下一个字符但它不移动内置指针。转载于:https://www.cnblogs.com/yyxayz/p/4078178.html