1

私は次のコードを持っていますが、結果が次のようになる理由がよくわかりません。

#include <iostream>
#include <sstream>

using namespace std;
int main () {

   std::stringstream s;

   std::streambuf *backup;
   backup = cout.rdbuf();


   s << "Oh my god" << endl;


   cout << "Before1" << endl;
       cout << s.rdbuf();
   cout << "After1" << endl;


   cout << "Before2" << endl;
   //s.seekg(0, std::ios_base::beg); // If that is in: After 2 is printed!
   cout << s.rdbuf();
   //cout.rdbuf(backup); // If that is in, also After 2 is printed!
   cout << "After2" << endl;

}

出力:

Before1
Oh my god
After1
Before2

残りはどこにありますか??¿上記の行のコメントを外した場合にのみ出力されます...内部で何が起こりますか?誰か知っていますか?=)おもしろいでしょう...

4

1 に答える 1

4

フェイルビットがオンに設定されているかどうかを確認しcoutます。を使用して、失敗ビットをクリアすることもできますcout.clear()


この場合、フェイルビットを設定する必要がある標準(セクション27.7.3.6.3)のルールは次のとおりです。

basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);

効果:フォーマットされていない出力関数として動作します。歩哨オブジェクトが構築された後、ifsbがnull呼び出しsetstate(badbit)(スローされる可能性がありますios_base::failure)。

から文字を取得しsb、に挿入します*this。次のいずれかが発生するまで、文字の読み取りsbと挿入が行われます。

  • ファイルの終わりは入力シーケンスで発生します。
  • 出力シーケンスへの挿入は失敗します(この場合、挿入される文字は抽出されません)。
  • から文字を取得しているときに例外が発生しsbます。

関数が文字を挿入しない場合は、呼び出しますsetstate(failbit)(これにより、がスローされる可能性がありますios_base::failure)。文字の抽出中に例外がスローされた場合、関数はfailbitエラー状態に設定され、 failbitonの場合exceptions()、キャッチされた例外が再スローされます。

戻り値:*this

于 2012-07-11T21:38:37.540 に答える