2016-02-08 8 views
5

Ich war überrascht, mein Programm plötzlich ruhig gehen, um zu sehen, wenn ich einen cout an einem gewissen Punkt hinzugefügt, so isolierte ich den verantwortlichen Code:stringstream.rdbuf verursacht cout zu scheitern

std::stringstream data; 
data<<"Hello World\n"; 
std:std::fstream file{"hello.txt", std::fstream::out}; 
file<<data.rdbuf(); 
std::cout<<"now rdbuf..."<<std::endl; 
std::cout<<data.rdbuf()<<std::endl; 
std::cout<<"rdbuf done."<< std::endl; 

Das Programm leise beendet, ohne die endgültigen cout. Was ist los? Wenn ich stattdessen die letzte .rdbuf() zu .str() ändere, dann wird es abgeschlossen.

Antwort

6

während des Anrufs std::cout<<data.rdbuf(), std::cout kann keine Zeichen aus datafilebuf s lesen, weil die Leseposition bereits am Ende der Datei nach dem vorhergehenden Ausgang ist; accordingly setzt dies failbit auf std::cout, und bis dieser Status gelöscht wird, wird jede weitere Ausgabe ebenfalls fehlschlagen (d. H. Ihre letzte Zeile wird im Wesentlichen ignoriert).

std::cout<<data.str()<<std::endl; nicht cout verursachen einen fehlerhaften Zustand einzutreten, weil data.str() eine Kopie des zugrunde liegenden String zurückgibt, unabhängig davon, wo die Leseposition (für Mixed-Mode-stringstreams sowieso).

+0

Ok also es bricht dann eigentlich nicht ab, ich habe meine Frage aktualisiert um schlauer zu werden. –

+0

Alternativ können Sie 'if (data.rdbuf() -> in_avail()) std :: cout << data.rdbuf();', so dass Sie eine temporäre std :: string speichern. Nicht sicher, dass sich jemand darum kümmern sollte. Und danke für die Frage und die Antwort! Habe meinen Tag gerettet. – wessel