De un borrador de documento estándar C ++ 17:
30.4.3 Objetos de corriente estrecha [narrow.stream.objects]
istream cin;
1 El objeto cin
controla la entrada de un búfer de flujo asociado con el objeto stdin
, declarado en <cstdio>
(30.11.1).
2 Una vez cin
inicializado el objeto , cin.tie()
vuelve &cout
. Por lo demás, su estado es el mismo que el requerido para basic_ios<char>::init
(30.5.5.2).
ostream cout;
3 El objeto cout
controla la salida a un búfer de flujo asociado con el objeto stdout
, declarado en <cstdio>
(30.11.1).
ostream cerr;
4 El objeto cerr
controla la salida a un búfer de flujo asociado con el objeto stderr
, declarado en <cstdio>
(30.11.1).
5 Una vez cerr
inicializado el objeto , cerr.flags() & unitbuf
es distinto de cero y cerr.tie()
vuelve &cout
. Por lo demás, su estado es el mismo que el requerido para basic_ios<char>::init
(30.5.5.2).
ostream clog;
6 El objeto clog
controla la salida a un búfer de flujo asociado con el objeto stderr
, declarado en <cstdio>
(30.11.1).
Discusión...
cout
escribe a stdout
; cerr
y clog
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
y cerr
están atados acout
Ambos se lavan cout
antes de manejar las operaciones de E / S ellos mismos. Esto asegura que las solicitudes enviadas a cout
sean visibles antes de que los bloques de programa para leer la entrada cin
, y que la salida anterior cout
se vacíe antes de escribir un error cerr
, 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.
stdout
,stdin
(paracin
), ystderr
que se usa por defecto. Creo queclog
es solocerr
con un cambio de búfer.