1

私はgcc、VS2010でうまく機能する古いコードを持っています。私はVS2012で同じものをコンパイルしようとしていました。私はどこでも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、代わりに機能して印刷されますプラットフォームツールセットをVS2012に変更すると、 EOFに達した後stream_eof
は機能せず0、代わりに印刷されますstream_eof

アフターカウトを入れると、if(stream_eof)return 0;VS2010には戻りますが、VS2012には戻りません。

4

1 に答える 1

2

これは、C++03とC++11の違いの1つです。

C ++ 03では、seekg()エラービットが設定されているストリームを呼び出すと、失敗して他に何もしません。

C ++ 11では、seekg()最初に無条件にをクリアしてeofbitから、指示どおりにクリアしようとします。この場合、failbitも設定されているため失敗しますが、eofbitクリアされたままになります。

(ちなみに、そもそもループがファイルの終わりを超えて読み取るように設定されているのはなぜですか?通常を使用してくださいwhile(getline(stream, line))

于 2013-02-10T05:06:44.790 に答える