2009-04-07 10 views
5

私はこのコードは、 ストリングストリームrdbuf()とstr()が私に異なる出力を与えているのはなぜですか?

int main() 
{ 
    std::string st; 
    std::stringstream ss; 
    ss<<"hej hej med dig"<<std::endl; 

    std::getline(ss,st,' '); 
    std::cout <<"ss.rdbuf()->str() : " << ss.rdbuf()->str(); 
    std::cout <<"ss.rdbuf() : " << ss.rdbuf(); 
    return 0; 
} 

が私にこの出力を与える必要があり

ss.rdbuf() - > STR():HEJはHEJが

ss.rdbufを掘るMED():HEJ医学掘削

しかし、それはなぜですか?それはオペレータ<のstr()のostreamsの定義のために私は別の出力を与えますか? getlineを使っても、私の目では出力は同じになるはずです。

答えて

6
ss.rdbuf()->str(); 

戻り値は、すべてのバッファの内容をコピーします。

std::cout << ss.rdbuf();をやって何?

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

ため

説明を参照してくださいそれはEOFまで/ /例外が発生した書き込みに失敗し、バッファから文字ずつ読んでのostreamに書き込みます。

あなたはすでにbuffから1単語を読みました。今は休憩部分を読んでいます。

+0

ああ。私が高価なC++の本の中でそれを見つけたという事実は、休暇中のImなので、私はgoogleしか持っていないので、私が理解した方法でオペレータ<<の行動を説明するサイトを見つけることができませんでした。私は実際にgetlineがストリームからdelimを使ってトークンを削除したと考えました。 – mslot

+1

高価なC++の本を使用していませんでした。私はちょうどこの振る舞いがrbuf()が指定されておらず、このオーバーロード演算子<<の標準で見始めるようにしています。 – bayda

+1

http://ra.dkuug.dk/jtc1/sc22/open/n2356/ - フリーC++の標準ドラフト – bayda

3

ストリームバッファ(すなわちrdbuf()によって返されたもの)のstr()を呼び出すことは、非常に直感的なやり方で動作します(72ページの「私の版」の72ページを参照してください) )。完全なストーリーのためには、あなたは本を読む必要があります。あなたはここで満足のいく答えを得られない場合は

、Usenetグループを試してみてください。

http://groups.google.com/group/comp.lang.c++.moderated

+0

ああ。私はその本について頭を上げたことはありません!!良い本のように聞こえる。なぜなら、私はC++ストリームの複雑さに似ていると思うからだ。 – mslot

+0

ストリームに興味があるなら、それは良い本です。率直に言えば、C++のプログラマー(私が含む)はほとんどいない。 –

+0

しかし、私の例では、getlineの最初のパラメータがcall-by-referenceなので、rdbuf()とrdbuf() - > str()は同じものを返してはいけませんか? – mslot

関連する問題