2010-07-08 12 views
25

¿Cuál es la diferencia entre ellos y cómo se usan? ¿Alguien me puede indicar ejemplos?¿Qué son "cerr" y "stderr"?

Específicamente, ¿cómo se "escribe" en la secuencia en ambos casos y cómo se recupera y se emite (es decir, a la pantalla) el texto que se le ha escrito?

Además, la salida de "pantalla" es en sí misma una corriente ¿no? Tal vez no entiendo las transmisiones lo suficientemente bien. Esto también se puede guardar en un archivo, por supuesto, lo sé. ¿Usarían todos estos fprintf/fscanf, etc.?

+8

No hay necesidad de disculparse por hacer una pregunta de novato. SO está destinado a _todos_ niveles de habilidad. – paxdiablo

Respuesta

32

cerr es la secuencia de C++ y stderr es el identificador de archivo C, ambos representan la salida de error estándar.

Usted escribe a ellos de la misma manera que se escribe en otros arroyos y archivo de llaves:

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

no estoy seguro de lo que entendemos por "recuperar" en este contexto, la salida va a un error estándar y Eso es. El programa no debe preocuparse por eso después de eso. Si quiere decir cómo guardarlo para más adelante, desde fuera del programa, vea el siguiente párrafo.

Por defecto, que van a ir a su terminal, pero la salida puede ser redirigido a otra parte con algo como:

run_my_prog 2>error.out 

Y, sí, la salida "pantalla" es una corriente (o identificador de archivo), pero eso es generalmente solo porque stdout/cout y stderr/cerr están conectados a su "pantalla" por defecto. Redirección afectará esto como en el siguiente caso en el que nada se escribirá en la pantalla:

run_my_prog >/dev/null 2>&1 

(cosas difíciles como escribir directamente a pesar de /dev/tty). Ese fragmento redirigirá tanto la salida estándar como el error estándar para ir al cubo de bits.

+2

La otra diferencia es que el error estándar no está almacenado en el búfer (es decir, el flujo automático en cada escritura) o el búfer de línea (limpieza automática en cada '\ n') independientemente de si se refiere a un dispositivo interactivo o no. Por el contrario, la salida estándar está completamente protegida si (y solo si) no se refiere a un dispositivo interactivo. –

+2

Bueno, técnicamente eso es una diferencia entre stdout y stderr (o cout y cerr), no cerr y stderr :-) – paxdiablo

6

¿Cuál es la diferencia entre ellos

stderr es una FILE*, y parte de la biblioteca estándar C. cerr es un ostream, y parte de la biblioteca estándar de C++.

Además, la salida "pantalla" es en sí misma una corriente ¿no?

Sí, lo es. Pero en realidad hay dos secuencias que escriben en la pantalla de forma predeterminada: stdout/cout es para salida normal y stderr/cerr es para mensajes de error. Esto es útil para la redirección: puede redirigir stdout a un archivo pero aún tiene sus mensajes de error en la pantalla.

+0

¿Es posible obtener el puntero 'FILE * stderr' del objeto' std :: ostream cerr'? (algo como 'cerr.rdbuf() -> bla') – alfC

+0

@alfC: No hay una forma estándar de hacerlo. Ver http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream. – dan04

+0

sí, respondí allí http://stackoverflow.com/a/19749019/225186. Creo que la respuesta más elegante es esta: http://stackoverflow.com/a/33612982/225186 – alfC

Cuestiones relacionadas