Da una bozza di documento standard C ++ 17:
30.4.3 Oggetti Narrow Stream [narrow.stream.objects]
istream cin;
1 L'oggetto cin
controlla l'input da un buffer di flusso associato all'oggetto stdin
, dichiarato in <cstdio>
(30.11.1).
2 Dopo che l'oggetto cin
è stato inizializzato, cin.tie()
ritorna &cout
. Il suo stato è altrimenti lo stesso richiesto per basic_ios<char>::init
(30.5.5.2).
ostream cout;
3 L'oggetto cout
controlla l'output in un buffer di flusso associato all'oggetto stdout
, dichiarato in <cstdio>
(30.11.1).
ostream cerr;
4 L'oggetto cerr
controlla l'output in un buffer di flusso associato all'oggetto stderr
, dichiarato in <cstdio>
(30.11.1).
5 Dopo che l'oggetto cerr
è stato inizializzato, cerr.flags() & unitbuf
è diverso da zero e cerr.tie()
restituisce &cout
. Il suo stato è altrimenti lo stesso richiesto per basic_ios<char>::init
(30.5.5.2).
ostream clog;
6 L'oggetto clog
controlla l'output in un buffer di flusso associato all'oggetto stderr
, dichiarato in <cstdio>
(30.11.1).
Discussione...
cout
scrive a stdout
; cerr
e clog
astderr
Standard Out ( stdout
) ha lo scopo di ricevere un output non di errore e non diagnostico dal programma, come l'output di un'elaborazione riuscita che può essere visualizzato all'utente finale o trasmesso in streaming in una fase di elaborazione successiva.
Standard Error ( stderr
) è inteso per l'output diagnostico, come i messaggi di avviso e di errore che indicano che il programma non ha o potrebbe non aver prodotto l'output che l'utente potrebbe aspettarsi. Questo input può essere visualizzato all'utente finale anche se i dati di output vengono reindirizzati a un'ulteriore fase di elaborazione.
cin
e cerr
sono legati acout
Entrambi svuotano cout
prima di gestire le operazioni di I / O. Ciò garantisce che i prompt inviati cout
siano visibili prima dei blocchi di programma da cui leggere l'input cin
e che l'output precedente cout
venga cancellato prima di scrivere un errore cerr
, il che mantiene i messaggi in ordine cronologico della loro generazione quando entrambi sono diretti allo stesso terminale / file / eccetera..
Questo contrasta con clog
: se scrivi lì, non verrà bufferizzato e non è legato a nulla, quindi bufferizzerà quantità di registrazione di dimensioni decenti prima dello scaricamento. Ciò produce la massima velocità di trasmissione dei messaggi, ma significa che i messaggi potrebbero non essere rapidamente visibili a un potenziale consumatore che legge il terminale o che segue il registro.
stdout
,stdin
(percin
), estderr
che utilizza per impostazione predefinita. Credoclog
sia solocerr
con una modifica del buffering.