2013-08-09 15 views
6

Ho pensato che questo programma dovesse stampare 1 e quindi bloccato. Ma non stampa nulla, si blocca. cout << endl o cout << endl o cout.flush() in grado di risolvere questo problema, ma voglio ancora sapere perché non funziona come previsto :) Questo problema è apparso durante il concorso codeforces e ho passato un sacco di tempo a guardare lo strano comportamento del mio programma. Non era corretto, si è anche bloccato, l'output nascosto era in realtà informazioni di debug.Problema con l'output della console C++

Ho provato a utilizzare printf (compilando con gcc) e si comporta come cout, quindi questa domanda può essere riferita anche a C.

+2

Si sa già che 'flush' modifica il comportamento (' << endl' esegue anche il flush implicito). Puoi leggere cosa fa "flush". Cos'altro c'è da dire? – Jon

+1

Impossibile riprodurre, stampa 1 con VS2012 – Borgleader

+0

Uso g ++ e linux. –

risposta

8

Si scrive su un buffer. È necessario svuotare il buffer. Come menzionato @Guvante, utilizzare cout.flush() o fflush(stdout) per printf.

Aggiornamento:

Sembra fflush effettivamente funziona con cout. Ma non farlo - potrebbe non essere il fatto in tutti i casi.

+0

Puoi spiegare perché si svuota senza 'while (true);'? –

+0

Intendo 'printf' e C, non C++. –

+1

Tutti i buffer vengono svuotati al termine del processo. – Eugene

2

Ciò è dovuto all'emissione dei buffer cout. Devi svuotare il buffer per farlo effettivamente stampare.

endl e flush() entrambi eseguono questo lavaggio.

Si noti inoltre che il programma si blocca perché si dispone di un ciclo infinito (while(true);).

Il motivo è che, se si stampano molti dati (ad esempio 1000 numeri), è possibile farlo in modo estremamente più efficiente. Inoltre, la maggior parte dei punti dati secondari termina con endl in ogni caso, dal momento che si desidera che l'output si estenda su più righe.

+1

La formulazione della domanda mi suggerisce che il ciclo infinito era intenzionale. – SirGuy

+0

@GuyGreer: Sono d'accordo, ma dal momento che ';' è facile non notare la necessità di includere quel bit. Soprattutto dato l'avviso "Ho ricevuto questo codice da qualche parte". – Guvante

Problemi correlati