1

我有一段在 gcc VS2010 上运行良好的旧代码。我试图在 VS2012 中编译相同的。我知道我在任何地方都没有将 done 设置为 true,但它不是实际的代码。我已经缩短了重现问题的代码。

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,它不会并0stream_eof 它达到 EOF 后打印

如果我放一个if(stream_eof)return 0;after cout 它会在 VS2010 上返回,但不会在 VS2012 中返回

4

1 回答 1

2

这是 C++03 和 C++11 的区别之一。

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

在 C++11 中,seekg()首先无条件清除eofbit,然后尝试按照指示进行操作。在这种情况下,因为failbit也被设置,它失败,但eofbit被清除。

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

于 2013-02-10T05:06:44.790 回答