2017-01-13 3 views
0

C++のstringstreamの詳細を理解しようとしています。しかし、stringstreamオブジェクトを再入力しようとしたときに問題が発生しました( "< <")。 (すなわち、objの内容は同じままです。)私のコードは以下の通りです。出力はコメントに表示されます。C++:再入力stringstreamが機能しないのはなぜですか?内容は同じままです

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

using namespace std; 

int main() 
{ 
    stringstream sso; 
    cout <<"orginal: " << sso.str() <<endl; //orginal:"empty" 
    sso << "A" << " " << "B" << " " << "C"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    string r1, r2, r3; 
    sso >> r1 >> r2 >> r3; 
    cout << "flowout:" << r1 << r2 << r3 << endl;//flowout:ABC 
    cout << "base: " << sso.str() << endl; //base: A B C 

    cout << "----problem here-----" << endl; 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    cout << "----this works-----" << endl; 
    sso.clear(); //clear flag 
    sso.str(""); //clear content 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:D E F 

    return 0; 
} 

なぜですか?私は "---ここで問題---"の結果を理解していません。なぜssoは新しい入力を受け入れないのですか?

Apprecited、

答えて

0

それはまだr3のためのより多くの文字を読み取ろうとしている間にもう文字が入手できなかったので、sso >> r1 >> r2 >> r3;の最後の読み取りが失敗状態にストリームを置きます。

エラーが発生した状態では、ストリームの書き込みまたは読み出しができません。問題を解決するにはsso.clear();までsso << "D"まで移動してください。

Cの後に余分な空白を出力すると、ストリームが失敗状態にならない(ストリームにまだ空きがある場合はr3が正常に読み込まれる)ため、さまざまな動作が発生する可能性があります。

+0

ありがとうございました。 :) –

関連する問題