Recordé haber leído sobre esto en el estándar, así que aquí va:
Consulte el estándar C11 que define cómo se comportan las transmisiones estándar, ya que los programas C ++ interactúan con la CRT, el estándar C11 debe regir la política de descarga aquí.
ISO / IEC 9899: 201x
7.21.3 §7
Al inicio del programa, tres flujos de texto están predefinidos y no necesitan abrirse explícitamente: entrada estándar (para leer la entrada convencional), salida estándar (para escribir la salida convencional) y error estándar (para escribir la salida de diagnóstico). Como se abrió inicialmente, el flujo de error estándar no está completamente protegido; las secuencias de entrada y salida estándar están totalmente almacenadas si solo se puede determinar que la secuencia no se refiere a un dispositivo interactivo.
7.21.3 §3
Cuando una secuencia no tiene búfer, los caracteres deben aparecer desde el origen o en el destino lo antes posible. De lo contrario, los caracteres pueden acumularse y transmitirse hacia o desde el entorno host como un bloque. Cuando una secuencia está completamente almacenada en búfer, los caracteres están destinados a ser transmitidos hacia o desde el entorno host como un bloque cuando se llena un búfer. Cuando una secuencia tiene un buffer de línea, los caracteres están destinados a ser transmitidos hacia o desde el entorno host como un bloque cuando se encuentra un carácter de nueva línea. Además, los caracteres están destinados a ser transmitidos como un bloque al entorno host cuando se llena un búfer, cuando se solicita la entrada en un flujo sin búfer, o cuando se solicita la entrada en un flujo con búfer de línea que requiere la transmisión de caracteres desde el entorno del host .
Esto significa que std::cout
y std::cin
están plenamente compensados si y sólo si se están refiriendo a un dispositivo no interactivo. En otras palabras, si stdout está conectado a un terminal, entonces no hay diferencia en el comportamiento.
Sin embargo, si std::cout.sync_with_stdio(false)
se llama, entonces '\n'
no provocará una descarga incluso en dispositivos interactivos. De '\n'
lo contrario, es equivalente a std::endl
menos que se canalice a los archivos: c ++ ref en std :: endl .