seekg前记得手动清除EOF标志位

问题

因为具体任务,需要一个文件读取两遍。

之前在第一次读取完毕后(此时EOF已经置位),直接调用

is.seekg(0,is.beg) ;

然后下次读取时直接退出了,即EOF标志位并没有被清除。

查看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.

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

然而,我测试 g++ 4.8.5, 指定-std=c++11 , 以及使用VS2015,发现seekg均失败。

照理说这些编译器应该都实现C++11标准了,然而这个问题依然如此。

这还是有些尴尬的。标准一回事、实现一回事,而且两个主要实现都不支持新标准…

不得不让我联想起空穴来风这个成语来了…

解决

一定seekg之前手动clear掉(EOF)标志位。

is.claer() ;
is.seekg(0 , is.beg) ;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值