stream seekg()实现从VS2012到2010不等

时间:2013-02-09 16:46:18

标签: c++ visual-studio-2010 visual-studio-2012 stream

我有一段旧代码在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中不会返回

1 个答案:

答案 0 :(得分:2)

这是C ++ 03和C ++ 11之间的差异之一。

在C ++ 03中,当您在设置了任何错误位的流上调用seekg()时,它会失败并且不执行任何其他操作。

在C ++ 11中,seekg()首先无条件地清除eofbit,然后尝试按照说明进行操作。在这种情况下,由于failbit也已设置,因此会失败,但eofbit会被清除。

(顺便说一句,为什么你的循环设置为首先读取文件末尾?使用通常的while(getline(stream, line))