2016-02-08 19 views
5

Sono rimasto sorpreso di vedere il mio programma improvvisamente andare tranquillo quando ho aggiunto un cout ad un certo punto, così ho isolato il codice responsabile:stringstream.rdbuf causando cout a fallire

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; 

Il programma si chiude tranquillamente senza la finale cout. Cosa sta succedendo? Se cambio l'ultimo .rdbuf() a .str(), allora è completo.

risposta

6

Durante la chiamata al std::cout<<data.rdbuf(), std::cout è in grado di leggere i caratteri da data s' filebuf perché la posizione di lettura è già alla fine del file dopo l'uscita precedente; accordingly, questo imposta failbit su std::cout e fino a quando questo stato non viene cancellato, qualsiasi ulteriore output avrà esito negativo (vale a dire che la linea finale viene essenzialmente ignorata).

std::cout<<data.str()<<std::endl; non causerà cout per immettere uno stato di errore perché data.str() restituisce una copia della stringa sottostante indipendentemente da dove la posizione di lettura è (per stringstreams modalità mista comunque).

+0

Ok, quindi in realtà non abortire quindi, ho aggiornato la mia domanda per essere più intelligente. –

+0

In alternativa, si può 'if (data.rdbuf() -> in_avail()) std :: cout << data.rdbuf();', quindi si salva uno std :: string temporaneo. Non sono sicuro che a qualcuno dovrebbe interessarsene. E grazie per entrambe le domande e le risposte! Ho salvato la mia giornata. – wessel