大家好,又见面了,我是你们的朋友全栈君。
问题
因为具体任务,需要一个文件读取两遍。
之前在第一次读取完毕后(此时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) ;
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144769.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...