坑爹的 EOF

cover起因是这样的,在完成 C++ 期末项目的时候,好不容易编译成功了,结果实际运行的时候文件读取出了幺蛾子……明明是一模一样的代码,用 IDE 跑一点事没有,然而一到 Linux 下运行内部链表都给我扬了……

错误原因:

找 bug 的过程异常痛苦,一开始完全没有头绪,只知道肯定是读入时出了问题——可是我文件读入的函数写的简直标准(CV 大法),想来想去还是抱着试一试的心态查了一下 EOF 相关的 bug

结果和我遇到相同状况的人还挺多,确实是 EOF 判断机制上的问题。

我们主观认为读到最后一个字符就会停止,但实际上我们判断读取完成是由一个叫 eofbit 的东西来判断的,当读取到最后一个字符时,eofbit 并不会置为 false ,而是保持 true 状态接着向下确认后才置为 false

解决方法:

1、使用 peek( ) 将指针后移。

2、增加判断语句,改变结构:

1
2
3
4
5
6
7
8
9
10
while(true){
//xxxxxxxxxxxx
read the file;
//xxxxxxxxxxxx
if(feof(fpsr))
break; //退出循环
//xxxxxxxxxxxxxxxxxxxx
operation to the file;
//xxxxxxxxxxxxxxxxxxxx
}

上面的语法可以在最后多读取的那一次进行操作之前再进行一次 eof 判断来及时退出循环。