La salida puede almacenarse en búfer o sin búfer. Con la salida en búfer, la implementación guarda todo el resultado hasta que sea conveniente escribirlo en el disco (o donde sea). Esto es agradable y eficiente, pero si el programa falla, es muy probable que se pierda algo de producción. La implementación tiene que escribir una salida sin búfer en el disco a medida que ocurre, lo que puede ralentizar las cosas con muchas grabaciones en el disco, pero a menos que se cuelgue un programa mientras se está escribiendo, se escribirá en el disco.
No existe una diferencia funcional real entre la salida estándar y el error estándar; son solo dos flujos de salida diferentes que se pueden redirigir por separado. La filosofía de Unix de encadenar herramientas en conjunto es que la salida estándar tendrá el resultado adecuado para entrar en la entrada de la siguiente herramienta, y esto requiere que haya una secuencia separada para los mensajes de error.
Por lo tanto, cout
escribe a la salida estándar, y se almacena en el búfer. Use esto para salida normal. cerr
escribe en la secuencia de error estándar y no se almacena. Use esto para mensajes de error. clog
escribe en la secuencia de error estándar, pero se almacena en el búfer. Esto es útil para el registro de ejecución, ya que no interfiere con la salida estándar, pero es eficiente (a costa de que el final del registro se pierda si el programa falla).
¿Quién dice que no se puede redirigir a cerr? ¡Lo hago todo el tiempo! –