fstream eof 死循环

问题:

在使用fstream eof判断是否到达文件结尾时,遇到了死循环问题,具体代码如下:

std::fstream fs;

fs.open("/home/test.txt",std::ios_base::app);

std::streampos cur_pos = fs.tellg();

fstream_.seekg(0, std::ios_base::end);  //注释1 读指针移动到文件末尾

char read_char = fs.get(); //注释2 会使EOF标志置位

fs.seekg(cur_pos); //注释3 执行该语句会导致后面while循环为死循环

while(!fs.eof()){      //注释4 死循环

    read_char = fs.get();

    printf("%d\n",read_char);   //注释5 一直打印FF

}   

第一次while循环可以正常推出,第二次while循环一直无法退出,且get的结果一致为FF。

查看C++标准库说明:

C++98
If the eofbit flag is set before the call, the function fails (sets failbit and returns).
C++11
The function clears the eofbit flag, if set before the call.

 以上说明针对seekg函数,按照标准库说法,C++98时如果EOF被置位,那么调用seekg会失败;但是在C++11中,上面说会首先清除EOF标志位。

分析:

文件到达末尾时,EOF标志位置位(注释1),此时执行seekg导致EOF标志位被清除,但是此时seekg执行结果还是会失败,也就是读指针仍然位于文件结尾,所以后面get的结果会一直为FF(注释5),而这种状态下get结果也不会再去修改EOF将其置位,最终导致while死循环(注释4),个人感觉此种情况应该还是能够把EOF置位才比较合理。

解决方法:

在seekg函数前显示清除一下EOF标志位即可,即在seekg函数前执行fs.clear()。

总结:

EOF标志被置位后,需要先执行fs.clear()清除标志位,再执行seek操作,否则会导致读指针和EOF标志不同步的问题,个人感觉这种情况算是fstream对EOF标志处理的一个bug。

参考:

fstream读写翻车 - 知乎

seekg前记得手动清除EOF标志位_小文件的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值