He intentado investigar la diferencia entre cout
, cerr
y clog
en Internet, pero no pude encontrar una respuesta perfecta. Todavía no tengo claro cuándo usar cuál. ¿Alguien puede explicarme, a través de programas sencillos, e ilustrar una situación perfecta sobre cuándo usar cuál?
Visité este sitio que muestra un pequeño programa en cerr
y clog
, pero el resultado obtenido allí también se puede obtener usando cout
. Entonces, estoy confundido sobre el uso exacto de cada uno.
stdout
,stdin
(paracin
), ystderr
que se usa por defecto. Creo queclog
es solocerr
con un cambio de búfer.Respuestas:
stdout
ystderr
son transmisiones diferentes, aunque ambas se refieren a la salida de la consola de forma predeterminada. Redirigir (canalizar) uno de ellos (p. Ej.program.exe >out.txt
) no afectaría al otro.Generalmente,
stdout
debe usarse para la salida real del programa, mientras que toda la información y los mensajes de error deben imprimirsestderr
, de modo que si el usuario redirige la salida a un archivo, los mensajes de información aún se imprimen en la pantalla y no en el archivo de salida.fuente
Generalmente se usa
std::cout
para resultados normales,std::cerr
para errores ystd::clog
para "registro" (que puede significar lo que quiera que signifique).La principal diferencia es que
std::cerr
no tiene búfer como los otros dos.En relación con la antigua C
stdout
ystderr
,std::cout
corresponde astdout
, mientrasstd::cerr
ystd::clog
ambos corresponden astderr
(excepto questd::clog
está almacenado en búfer).fuente
clog
también se envía acerr
. Entonces, en base a eso, ¿cuál eliges? Siclog
es normalmente para "registro", ¿por qué querría que vaya al flujo de errores? Los registros parecen más "registros normales" (también conocidos comocout
) que errores.cerr
yclog
usan la salida estándar de "error", peroclog
están almacenados en búfer, lo que podría ser la razón por la que parece máscout
. ¿Cuál elegir para la salida de error? Depende, supongo, de más razones de las que puedo enumerar y tiene que decidirse de un caso a otro.Flujo de salida estándar (cout):
cout
es la instancia de laostream
clase.cout
se utiliza para producir salida en el dispositivo de salida estándar que suele ser la pantalla de visualización. Los datos necesarios para mostrarse en la pantalla se insertan en el flujo de salida estándar (cout
) usando el operador de inserción (<<
).Secuencia de error estándar sin búfer (cerr):
cerr
es la secuencia de error estándar que se utiliza para generar los errores. Esta también es una instancia de laostream
clase. Comocerr
está sin búfer , se usa cuando necesitamos mostrar el mensaje de error inmediatamente. No tiene ningún búfer para almacenar el mensaje de error y mostrarlo más tarde.Flujo de error estándar almacenado en búfer (obstrucción): también es una instancia de
ostream
clase y se utiliza para mostrar errores, pero a diferenciacerr
del error, primero se inserta en un búfer almacenado en búfer y se almacena en el búfer hasta que no se llena por completo.lectura adicional: basic-input-output-c
fuente
La diferencia de estos 3 flujos es el almacenamiento en búfer.
Verifique el siguiente código y ejecute DEBUG a través de 3 líneas: f (std :: clog), f (std :: cerr), f (std :: out), luego abra 3 archivos de salida para ver qué sucedió. Puede intercambiar estas 3 líneas para ver qué sucede.
fuente
fuente
De un borrador de documento estándar C ++ 17:
Discusión...
cout
escribe astdout
;cerr
yclog
parastderr
Salida estándar (
stdout
) está destinado a recibir resultados sin errores ni diagnósticos del programa, como los resultados de un procesamiento exitoso que pueden mostrarse al usuario final o transmitirse a alguna etapa de procesamiento adicional.Error estándar (
stderr
) está destinado a la salida de diagnóstico, como los mensajes de advertencia y error que indican que el programa no ha producido o puede que no haya producido la salida que el usuario podría esperar. Esta entrada se puede mostrar al usuario final incluso si los datos de salida se canalizan a una etapa de procesamiento adicional.cin
ycerr
están atados acout
Ambos se lavan
cout
antes de manejar las operaciones de E / S ellos mismos. Esto asegura que las solicitudes enviadas acout
sean visibles antes de que los bloques de programa para leer la entradacin
, y que la salida anteriorcout
se vacíe antes de escribir un errorcerr
, lo que mantiene los mensajes en orden cronológico de su generación cuando ambos se dirigen al mismo terminal / archivo / etc ..Esto contrasta con
clog
: si escribe allí, no se almacenará en búfer y no estará vinculado a nada, por lo que almacenará en búfer cantidades decentes de registro antes de descargar. Esto produce el mayor rendimiento de mensajes, pero significa que los mensajes pueden no ser visibles rápidamente para un consumidor potencial que lee el terminal o sigue el registro.fuente
Tanto cout y zuecos se almacenan temporalmente, pero cerr es un-tamponada y todos estos son objetos que son instancias de ostream clase predefinida. El uso básico de estos tres son cout se utiliza para la entrada estándar mientras que zueco y cerr se utiliza para mostrar errores. El punto principal por el que cerr no está almacenado en búfer es porque suponga que tiene varias salidas en el búfer y se menciona una excepción de error en el código, entonces debe mostrar ese error de inmediato, lo que cerr puede hacer de manera efectiva.
Por favor, corríjame si estoy equivocado.
fuente