Aus einem Entwurf eines C ++ 17-Standarddokuments:
30.4.3 Objekte mit schmalen Streams [Objekte mit schmalen Streams]
istream cin;
1 Das Objekt cin
steuert die Eingabe aus einem Stream-Puffer stdin
, der dem in <cstdio>
(30.11.1) deklarierten Objekt zugeordnet ist .
2 Nach der cin
Initialisierung des Objekts wird cin.tie()
zurückgegeben &cout
. Sein Zustand ist ansonsten der gleiche wie für basic_ios<char>::init
(30.5.5.2) erforderlich .
ostream cout;
3 Das Objekt cout
steuert die Ausgabe in einen Stream-Puffer stdout
, der dem in <cstdio>
(30.11.1) deklarierten Objekt zugeordnet ist .
ostream cerr;
4 Das Objekt cerr
steuert die Ausgabe in einen Stream-Puffer stderr
, der dem in <cstdio>
(30.11.1) deklarierten Objekt zugeordnet ist .
5 Nachdem das Objekt cerr
initialisiert wurde, cerr.flags() & unitbuf
ist es ungleich Null und cerr.tie()
kehrt zurück &cout
. Sein Zustand ist ansonsten der gleiche wie für basic_ios<char>::init
(30.5.5.2) erforderlich .
ostream clog;
6 Das Objekt clog
steuert die Ausgabe in einen Stream-Puffer stderr
, der dem in <cstdio>
(30.11.1) deklarierten Objekt zugeordnet ist .
Diskussion...
cout
schreibt an stdout
; cerr
und clog
zustderr
Standard Out ( stdout
) soll fehlerfreie, nicht diagnostische Ausgaben vom Programm empfangen, z. B. Ausgaben von erfolgreicher Verarbeitung, die dem Endbenutzer angezeigt oder in eine weitere Verarbeitungsstufe gestreamt werden können.
Standard Error ( stderr
) ist für die Diagnoseausgabe vorgesehen, z. B. Warn- und Fehlermeldungen, die darauf hinweisen, dass das Programm die vom Benutzer erwartete Ausgabe nicht oder möglicherweise nicht erzeugt hat. Diese Eingabe kann dem Endbenutzer auch dann angezeigt werden, wenn die Ausgabedaten an eine weitere Verarbeitungsstufe weitergeleitet werden.
cin
und cerr
sind gebunden ancout
Beide werden gespült, cout
bevor E / A-Vorgänge selbst ausgeführt werden. Dadurch wird sichergestellt, dass die an gesendeten cout
Eingabeaufforderungen sichtbar sind, bevor das Programm die Eingaben blockiert cin
, und dass die frühere Ausgabe an cout
geleert wird, bevor ein Fehler durchgeschrieben cerr
wird. Dadurch werden die Nachrichten in chronologischer Reihenfolge ihrer Generierung gehalten, wenn beide an dasselbe Terminal / dieselbe Datei / gesendet werden etc..
Dies steht im Gegensatz zu clog
: Wenn Sie dort schreiben, wird es nicht gepuffert und ist an nichts gebunden, sodass vor dem Leeren ausreichend große Protokollierungsmengen gepuffert werden. Dies ergibt den höchsten Nachrichtendurchsatz, bedeutet jedoch, dass die Nachrichten für einen potenziellen Verbraucher, der das Terminal liest oder das Protokoll verfolgt, möglicherweise nicht schnell sichtbar sind.
stdout
,stdin
(zcin
), undstderr
dass sie standardmäßig verwendet. Ich glaubeclog
nurcerr
mit einer Pufferänderung.