8

ストリームのseekg(0)をクリアする必要があるかどうか、またその理由を知りたいです。eofbit私はすでにすべてのストリームを読み取ったため、EOF到達しました(ただし、まだ設定されていません) 。有効な位置に戻って、いくつかの文字を再度読み取りfailbitたいと考えています。seekg()この場合seekg(0)、セットで「動作する」ように見えeofbitますが、ストリームから読み取ろうとするとすぐに、failbit が設定されます。このロジックは正しいですか、それとも私の実装は悪いですか? このケースを認識して eofbit を手動でクリアする必要がありますか (failbit が設定されていない場合)?

編集:

読者から提供された次のプログラムは、私の実装で異なる結果をもたらします ( mingw32-c++.exe (TDM-2 mingw32) 4.4.1 ):

#include <sstream>
#include <iostream>
#include <string>

int main() {
        std::istringstream foo("AAA");
        std::string a;
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0
        foo.seekg(0);
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1
}

上記のコメントは、実装でそのプログラムを試したユーザーからのものです。次の結果が得られます。

1 0
1 0
1 1
1 1
4

2 に答える 2

3

新しい標準によると、 (§ 27.7.2.3)clear()をリセットすることになっています。eofbit

basic_istream<charT,traits>& seekg(pos_type pos);

効果:フォーマットされていない入力関数として動作します ... ただし、関数が最初にクリアされることを除いてeofbit...

しかし、古い標準 (§ 27.6.1.3) では、eofbit!のクリアについて言及されていません。

そして簡単なテスト:

#include <sstream>
#include <iostream>
#include <string>

int main() {
        std::istringstream foo("AAA");
        std::string a;
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0
        foo.seekg(0);
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 0 0
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 0
        foo >> a;
        std::cout << foo.eof() << " " << foo.fail() << std::endl; // 1 1
}
于 2012-04-13T12:52:42.407 に答える
0

ストリームを手動でclear()してから、eofbitが設定されたら戻るのはなぜですか?EOFに達しましたが、seekgが自動的にクリアする必要があるのはなぜですか?それを行うと、より多くの問題が発生するように思われます。

于 2012-04-13T12:49:38.117 に答える