2010-07-08 8 views
25

Was ist der Unterschied zwischen ihnen und wie werden sie verwendet? Kann mir jemand auf Beispiele hinweisen?Was sind "cerr" und "stderr"?

Wie schreibt man in beiden Fällen in den Stream und wie stellt man den Text wieder her und gibt ihn aus (d. H. Auf den Bildschirm)?

Auch die "Bildschirm" -Ausgabe ist selbst ein Stream oder? Vielleicht verstehe ich Ströme nicht gut genug. Dies kann natürlich auch in einer Datei gespeichert werden, weiß ich. Würden alle diese verwenden fprintf/fscanf, etc?

+8

Sie müssen sich nicht entschuldigen, wenn Sie eine neue Frage stellen. SO ist für alle Fähigkeitsstufen gedacht. – paxdiablo

Antwort

32

cerr ist der C++ - Stream und stderr ist das C-Datei-Handle, die beide die Standardfehlerausgabe darstellen.

Sie schreiben, um sie auf die gleiche Weise zu anderen Strömen und Datei schreiben Griffe:

cerr << "Urk!\n"; 
fprintf (stderr, "Urk!\n"); 

Ich bin nicht sicher, was Sie unter „erholen“ bedeutet in diesem Zusammenhang, der Ausgang geht an Standardfehler und das ist es. Das Programm soll sich danach nicht mehr darum kümmern. Wenn Sie beabsichtigen, es für später außerhalb des Programms zu speichern, lesen Sie den nächsten Abschnitt.

standardmäßig werden sie zu Ihrem Terminal gehen, aber der Ausgang kann an anderer Stelle wie mit etwas umgeleitet werden:

run_my_prog 2>error.out 

Und, ja, der „Bildschirm“ -Ausgabe ist ein Stream (oder Datei-Handle), aber Das liegt in der Regel nur daran, dass und stderr/cerr standardmäßig mit Ihrem "Bildschirm" verbunden sind. Umleitung wird dies wie im folgenden Fall betreffen, in denen nichts auf den Bildschirm geschrieben werden:

run_my_prog >/dev/null 2>&1 

(heikle Dinge wie direkt zu /dev/tty ungeachtet schreiben). Dieser Ausschnitt wird die Standardausgabe und den Standardfehler umleiten, um zum Bit-Bucket zu gelangen.

+2

Der andere Unterschied besteht darin, dass der Standardfehler entweder nicht gepuffert (d. H. Automatisch bei jedem Schreiben löschen) oder zeilengepuffert (automatisch bei jedem \ n "), unabhängig davon, ob er sich auf ein interaktives Gerät bezieht oder nicht. Im Gegensatz dazu ist die Standardausgabe vollständig gepuffert, wenn sie sich (und nur wenn) nicht auf ein interaktives Gerät bezieht. –

+2

Nun, technisch ist das ein Unterschied zwischen stdout und stderr (oder cout und cerr), nicht cerr und stderr :-) – paxdiablo

6

Was ist der Unterschied zwischen ihnen ist

stderr ist ein FILE*, und ein Teil der C-Standardbibliothek. cerr ist ein ostream und Teil der C++ - Standardbibliothek.

Auch die "Bildschirm" -Ausgabe ist selbst ein Strom rechts?

Ja, ist es. Aber es gibt tatsächlich zwei Streams, die standardmäßig auf den Bildschirm schreiben: stdout/cout ist für die normale Ausgabe und stderr/cerr ist für Fehlermeldungen. Dies ist nützlich für die Umleitung: Sie können stdout in eine Datei umleiten, haben aber immer noch Fehlermeldungen auf dem Bildschirm.

+0

Ist es möglich, den 'FILE * stderr' Zeiger vom' std :: ostream cerr' Objekt zu erhalten? (etwas wie 'cerr.rdbuf() -> bla') – alfC

+0

@alfC: Es gibt keinen Standardweg, dies zu tun. Siehe http://stackoverflow.com/questions/109449/getting-a-file-from-a-dfdfstream. – dan04

+0

ja, antwortete ich dort http://stackoverflow.com/a/19749019/225186. Ich denke, die eleganteste Antwort ist diese: http://stackoverflow.com/a/33612982/225186 – alfC