2009-04-07 13 views
5

ich diesen Code,Warum gibt Stringstream rdbuf() und str() mir unterschiedliche Ausgabe?

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; 
} 

mir Geben Sie diesen Ausgang

ss.rdbuf() -> str(): hej hej

ss.rdbuf graben med(): hej med dig

Aber warum ist das? Ist das wegen der Ostreams Definition des Operators < str() gibt mir unterschiedliche Ausgabe. In meinen Augen sollte die Ausgabe die selbe sein, selbst wenn ich getline benutzt habe.

Antwort

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

Rückgabe aller Pufferinhalt kopieren.

Was std::cout << ss.rdbuf(); tun?

siehe Beschreibung für

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

lesen Sie Zeichen für Zeichen aus dem Puffer und schreibt sie in Ostream, bis EOF/Fail auf Schreiben/Ausnahme auftritt.

Sie haben bereits ein Wort von Buff gelesen. Jetzt liest es Restteil.

+0

Oh. Die Tatsache, dass ich es in einem von mir teuren C++ - Büchern nicht gesucht habe, ist, dass ich im Urlaub bin, also habe ich nur Google und ich konnte eine Seite nicht finden, die das Verhalten des Betreibers in einer Weise erklärt, die ich verstanden habe. Ich dachte eigentlich, dass getline Tokens mit dem Delim vom Stream entfernt hat. – mslot

+1

Ich habe keines der teuren C++ - Bücher benutzt. Ich versichere nur, dass dieses Verhalten nicht rbuf() angegeben ist und im Standard nach diesem Überladungsoperator gesucht wird. – bayda

+1

http://ra.dkuug.dk/jtc1/sc22/open/n2356/ - frei C++ Standard-Entwurf – bayda

3

Um aus der Bibel in C++ stream E/A Langer and Kreft zu zitieren, benennt str() auf einem stream buffer (dh das von rdbuf() zurückgegebene) "sich extrem widersinnig" (Seite 72 in meiner Ausgabe)). Für die ganze Geschichte müssen Sie das Buch lesen.

Wenn Sie nicht eine befriedigende Antwort hier bekommen, versuchen Sie die Usenet-Gruppe:

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

+0

Oh. Ich bin noch nie wegen dieses Buches gegangen !! Klingt wie ein gutes Buch, weil ich glaube, dass ich die Komplexität von C++ - Streams mag. – mslot

+0

Es ist ein gutes Buch - wenn Sie an Streams interessiert sind. Was ehrlich gesagt, sind einige C++ Programmierer (mich eingeschlossen). –

+0

Aber in meinem Beispiel, sollten nicht die rdbuf() und rdbuf() -> str() die gleiche Sache wegen der ersten Parameter von getline ist ein Call-by-Referenz? – mslot