No, no es un comportamiento POSIX, es un comportamiento ISO (bueno, es un comportamiento POSIX pero solo en la medida en que se ajustan a ISO).
La salida estándar se almacena en línea si se puede detectar para referirse a un dispositivo interactivo, de lo contrario, está completamente protegida. Por lo tanto, hay situaciones en las printf
que no se vaciará, incluso si recibe una nueva línea para enviar, como:
myprog >myfile.txt
Esto tiene sentido para la eficiencia ya que, si está interactuando con un usuario, probablemente quiera ver cada línea. Si está enviando la salida a un archivo, lo más probable es que no haya un usuario en el otro extremo (aunque no es imposible, podrían estar siguiendo el archivo). Ahora podrías argumentar que el usuario quiere ver cada personaje, pero hay dos problemas con eso.
El primero es que no es muy eficiente. El segundo es que el mandato original de ANSI C era codificar principalmente el comportamiento existente , en lugar de inventar un nuevo comportamiento, y esas decisiones de diseño se tomaron mucho antes de que ANSI comenzara el proceso. Incluso ISO hoy en día pisa con mucho cuidado al cambiar las reglas existentes en los estándares.
En cuanto a cómo lidiar con eso, si fflush (stdout)
después de cada llamada de salida que desea ver de inmediato, eso resolverá el problema.
Alternativamente, puede usarlo setvbuf
antes de operar stdout
, para configurarlo como sin búfer y no tendrá que preocuparse por agregar todas esas fflush
líneas a su código:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Solo tenga en cuenta que puede afectar bastante el rendimiento si está enviando la salida a un archivo. También tenga en cuenta que el soporte para esto está definido por la implementación, no garantizado por el estándar.
La sección ISO C99 7.19.3/3
es el bit relevante:
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 del 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 .
El soporte para estas características está definido por la implementación y puede verse afectado a través de las funciones setbuf
y setvbuf
.