起因是这样的,在完成 C++ 期末项目的时候,好不容易编译成功了,结果实际运行的时候文件读取出了幺蛾子……明明是一模一样的代码,用 IDE 跑一点事没有,然而一到 Linux 下运行内部链表都给我扬了……
错误原因:
找 bug 的过程异常痛苦,一开始完全没有头绪,只知道肯定是读入时出了问题——可是我文件读入的函数写的简直标准(CV 大法),想来想去还是抱着试一试的心态查了一下 EOF 相关的 bug
结果和我遇到相同状况的人还挺多,确实是 EOF 判断机制上的问题。
我们主观认为读到最后一个字符就会停止,但实际上我们判断读取完成是由一个叫 eofbit 的东西来判断的,当读取到最后一个字符时,eofbit 并不会置为 false ,而是保持 true 状态接着向下确认后才置为 false。
解决方法:
1、使用 peek( ) 将指针后移。
2、增加判断语句,改变结构:
1 | while(true){ |
上面的语法可以在最后多读取的那一次进行操作之前再进行一次 eof 判断来及时退出循环。