Ich habe versucht , den Unterschied zwischen der Erforschung cout
, cerr
und clog
im Internet, konnte aber nicht eine perfekte Antwort finden. Mir ist immer noch nicht klar, wann ich welche verwenden soll. Kann mir jemand durch einfache Programme erklären und eine perfekte Situation veranschaulichen, wann welches zu verwenden ist?
Ich habe diese Seite besucht, die ein kleines Programm auf cerr
und zeigt clog
, aber die dort erhaltene Ausgabe kann auch mit erhalten werden cout
. Ich bin also verwirrt über die genaue Verwendung jedes Einzelnen.
stdout
,stdin
(zcin
), undstderr
dass sie standardmäßig verwendet. Ich glaubeclog
nurcerr
mit einer Pufferänderung.Antworten:
stdout
undstderr
sind unterschiedliche Streams, obwohl beide standardmäßig auf die Konsolenausgabe verweisen. Das Umleiten (Verrohren) eines von ihnen (z. B.program.exe >out.txt
) würde den anderen nicht beeinflussen.Im Allgemeinen
stdout
sollte für die eigentliche Programmausgabe verwendet werden, während alle Informationen und Fehlermeldungen gedruckt werden solltenstderr
, damit, wenn der Benutzer die Ausgabe in eine Datei umleitet, Informationsmeldungen weiterhin auf dem Bildschirm und nicht in der Ausgabedatei gedruckt werden.quelle
Im Allgemeinen verwenden Sie
std::cout
für die normale Ausgabe,std::cerr
für Fehler undstd::clog
für die "Protokollierung" (was bedeuten kann, was immer Sie wollen).Der Hauptunterschied besteht darin, dass
std::cerr
nicht wie die beiden anderen gepuffert wird.In Bezug auf das alte C
stdout
undstderr
,std::cout
entsprichtstdout
, währendstd::cerr
undstd::clog
beide entsprechenstderr
(außer dasstd::clog
ist gepuffert).quelle
clog
auch ausgegeben wirdcerr
. Also, basierend darauf, welches wählst du? Wenn diesclog
normalerweise für die "Protokollierung" vorgesehen ist, warum sollte das in den Fehlerstrom aufgenommen werden? Protokolle scheinen eher "normale Protokolle" (auch bekanntcout
als "Fehler" zu sein.cerr
undclog
verwendet die Standardausgabe "Fehler", ist aberclog
gepuffert, was möglicherweise der Grund dafür istcout
. Welches für die Fehlerausgabe auswählen? Kommt wohl auf mehr Gründe an, als ich auflisten kann und es muss von Fall zu Fall entschieden werden.Standardausgabestream (cout):
cout
ist die Instanz derostream
Klasse.cout
wird verwendet, um eine Ausgabe auf dem Standardausgabegerät zu erzeugen, bei dem es sich normalerweise um den Bildschirm handelt. Die Daten, die auf dem Bildschirm angezeigt werden müssen, werdencout
mit dem Einfügeoperator (<<
) in den Standardausgabestream ( ) eingefügt .Ungepufferter Standardfehlerstrom (cerr):
cerr
ist der Standardfehlerstrom, der zur Ausgabe der Fehler verwendet wird. Dies ist auch eine Instanz derostream
Klasse. Dacerr
es ungepuffert ist, wird es verwendet, wenn die Fehlermeldung sofort angezeigt werden muss. Es gibt keinen Puffer zum Speichern der Fehlermeldung und späteren Anzeige.Gepufferter Standardfehlerstrom (Clog): Dies ist auch eine Instanz der
ostream
Klasse und wird zum Anzeigen von Fehlern verwendet. Im Gegensatzcerr
zum Fehler wird dieser Fehler jedoch zuerst in einen Puffer eingefügt und im Puffer gespeichert, bis er nicht vollständig gefüllt ist.weiterführende Literatur: Basic-Input-Output-c
quelle
Der Unterschied dieser 3 Streams ist die Pufferung.
Überprüfen Sie den folgenden Code und führen Sie DEBUG in drei Zeilen aus: f (std :: clog), f (std :: cerr), f (std :: out). Öffnen Sie dann 3 Ausgabedateien, um zu sehen, was passiert ist. Sie können diese 3 Zeilen austauschen, um zu sehen, was passieren wird.
quelle
quelle
Aus einem Entwurf eines C ++ 17-Standarddokuments:
Diskussion...
cout
schreibt anstdout
;cerr
undclog
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
undcerr
sind gebunden ancout
Beide werden gespült,
cout
bevor E / A-Vorgänge selbst ausgeführt werden. Dadurch wird sichergestellt, dass die an gesendetencout
Eingabeaufforderungen sichtbar sind, bevor das Programm die Eingaben blockiertcin
, und dass die frühere Ausgabe ancout
geleert wird, bevor ein Fehler durchgeschriebencerr
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.quelle
Sowohl cout und Clog werden gepuffert aber cerr ist un-buffered und alle diese Objekte sind vordefiniert , die Instanzen der Klasse ostream sind. Die grundlegende Verwendung dieser drei sind cout für Standardeingabe verwendet , während Clog und cerr für zeigt Fehler verwendet wird. Der Hauptgrund, warum cerr nicht gepuffert ist, kann sein, dass Sie mehrere Ausgänge im Puffer haben und eine Fehlerausnahme im Code erwähnt wird. Dann müssen Sie diesen Fehler sofort anzeigen, was von cerr effektiv ausgeführt werden kann.
Bitte korrigieren Sie mich, wenn ich falsch liege.
quelle
cout wird normalerweise verwendet, um einige Anweisungen auf dem Benutzerbildschirm anzuzeigen. ex-: cout << "Arlene Batada";
Ausgabe:
Arlene Batada
quelle