我有一段旧代码在gcc,VS2010上运行良好。我试图在VS2012中编译相同的内容。我知道我在任何地方都设置为真,但它不是真正的代码。我缩短了代码以重现问题。
std::ifstream file_stream;
file_stream.open("C:\\experiment\\file.txt", std::ios_base::in);
std::istream& stream = file_stream;
bool done = false;
while(stream.good() || !done){
int stream_position = stream.tellg();
bool stream_failure = (stream_position == -1);
bool stream_eof = stream.eof();
std::string line;
std::getline(stream, line);
std::cout << stream_failure << stream_eof << std::endl;
std::streampos pos = stream.tellg();
if(pos == std::streampos(-1)){
std::streampos copy = pos;
stream.seekg(0, std::ios_base::end);
pos = stream.tellg();
stream.seekg(copy);
}
}
std::getline(std::cin, std::string());
file_stream.close();
如果我将平台工具集更改为VS2010,它可以正常工作并打印1
代替stream_eof
如果我将平台工具集更改为VS2012则不会,并打印0
代替stream_eof
在达到EOF之后
如果我在cout之后放置if(stream_eof)return 0;
它会在VS2010上返回但在VS2012中不会返回
答案 0 :(得分:2)
这是C ++ 03和C ++ 11之间的差异之一。
在C ++ 03中,当您在设置了任何错误位的流上调用seekg()
时,它会失败并且不执行任何其他操作。
在C ++ 11中,seekg()
首先无条件地清除eofbit
,然后尝试按照说明进行操作。在这种情况下,由于failbit
也已设置,因此会失败,但eofbit
会被清除。
(顺便说一句,为什么你的循环设置为首先读取文件末尾?使用通常的while(getline(stream, line))
)