write () para stdout y printf salida no intercalada?

#include  #define MAXLEN 256 int main() { int n; char buf[MAXLEN]; while((n = read(0,buf,sizeof(buf))) != 0){ printf("n: %d:",n); write(1,buf,n); } return 1; } 

La salida del progtwig (donde la primera read y la primera write es escrita por el usuario y repetida por la terminal) es:

 read read write write n: 5:n: 6: 

La salida de printf viene después de presionar Ctrl + D en la entrada estándar y no junto con las lecturas posteriores. ¿Por qué pasó esto?

Printf está almacenado en el búfer.

Puede forzar printf para ‘vaciar’ su buffer utilizando la llamada fflush:

 #include  #define MAXLEN 256 int main() { int n; char buf[MAXLEN]; while((n = read(0,buf,sizeof(buf))) != 0){ printf("n: %d:",n); fflush(stdout); /* force it to go out */ write(1,buf,n); } return 1; } 

En general, printf() está siendo amortiguado es una buena cosa. La salida sin búfer, particularmente para las consolas visibles que requieren actualizaciones de pantalla, etc., es lenta. Lo suficientemente lento como para que una aplicación que está imprimiendo mucho se ralentice directamente (especialmente en la plataforma de Windows, Linux y Unixes suelen tener un impacto menor).

Sin embargo, printf() se almacena en el búfer te muerde si también fprintf(stderr,)stderr es deliberadamente sin búfer. Como consecuencia, puede recibir sus mensajes con algún printf() faltante; si escribe en otro identificador FILE que también está asociado con el terminal y podría estar sin búfer, asegúrese de que primero fflush(stdout) explícitamente fflush(stdout) .

La página de manual de Fgets me dice:

No es aconsejable mezclar llamadas a funciones de entrada de la biblioteca stdio con llamadas de bajo nivel para leer (2) el descriptor de archivo asociado con el flujo de entrada; los resultados serán indefinidos y muy probablemente no sean los que usted desea.

Entonces, la mejor solución sería no usar write and printf en el mismo descriptor.

Printf usa stdio y está almacenado en el búfer. Elimínalo enviando un cambio a “n:% d: \ n”

Puede utilizar la función std fflush () para vaciar el búfer estándar o puede usar \ n adicional al final de la cadena de control dentro de printf. Algo como esto

 printf("\n :%d:\n",n); 

Siempre es mejor usar las funciones write () y read () en C en lugar de printf () y scanf (). Printf y scanf tienen algunos problemas, como printf almacena el parámetro de cadena en el búfer stdout. Por lo tanto, se requiere una descarga manual que se realiza a través de la función fflush o mediante \ n. En un pequeño progtwig de impresión hello world no encontrará un problema ya que el buffer de stdout se vacía al final de la ejecución del progtwig. Mejor uso write () que funciona bien. scanf también tiene el problema de leer espacios y muchos otros problemas relacionados con el buffer stdin.

Por ejemplo en el siguiente código:

 main() { char a; int i=0,c; for(;i<2;i++) { scanf("%d",&c); scanf("%c",&a);} } 

El progtwig anterior tiene el problema de leer \ n en stdin al presionar enter. Podríamos resolver esto, pero sin descargar el búfer stdin ni hacer uso del carácter \ n. Siempre es mejor usar las funciones de lectura () y escritura ().

Espero que ayude....

Utilice fwrite (versión de secuencias) en lugar de escribir.

Tenga en cuenta que, si bien está asociado con el número de archivo 1, no es lo mismo.