Aus einem Entwurf eines C ++ 17-Standarddokuments:
30.4.3 Objekte mit schmalen Streams [Objekte mit schmalen Streams]
istream cin;
1 Das Objekt cinsteuert die Eingabe aus einem Stream-Puffer stdin, der dem in <cstdio>(30.11.1) deklarierten Objekt zugeordnet ist .
2 Nach der cinInitialisierung 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 coutsteuert die Ausgabe in einen Stream-Puffer stdout, der dem in <cstdio>(30.11.1) deklarierten Objekt zugeordnet ist .
ostream cerr;
4 Das Objekt cerrsteuert die Ausgabe in einen Stream-Puffer stderr, der dem in <cstdio>(30.11.1) deklarierten Objekt zugeordnet ist .
5 Nachdem das Objekt cerrinitialisiert wurde, cerr.flags() & unitbufist 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 clogsteuert die Ausgabe in einen Stream-Puffer stderr, der dem in <cstdio>(30.11.1) deklarierten Objekt zugeordnet ist .
Diskussion...
coutschreibt an stdout; cerrund clogzustderr
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.
cinund cerrsind gebunden ancout
Beide werden gespült, coutbevor E / A-Vorgänge selbst ausgeführt werden. Dadurch wird sichergestellt, dass die an gesendeten coutEingabeaufforderungen sichtbar sind, bevor das Programm die Eingaben blockiert cin, und dass die frühere Ausgabe an coutgeleert wird, bevor ein Fehler durchgeschrieben cerrwird. 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), undstderrdass sie standardmäßig verwendet. Ich glaubeclognurcerrmit einer Pufferänderung.