2012-09-16 20 views
41

¿No se debe usar fflush() para enjuagar un búfer incluso si se trata de un flujo de salida?Buffers de limpieza en C

¿Para qué es útil? ¿Cómo lavamos un buffer en general?

+0

Ten en cuenta que sólo se fflush está bien definido para los flujos de salida, no se puede utilizar en los flujos de entrada: que sería indefinido comportamiento. – Lundin

+0

@Lundin ¿Está bien usarlo para enjuagar flujos de salida? – saadtaame

+2

@saadtaame Sí, eso es exactamente para lo que 'fflush()' es. – Mysticial

Respuesta

75

Nunca he escuchado que no descargue el búfer de salida, y me gustaría escuchar su fuente al respecto. Cisternas de los buffers de salida:

printf("Buffered, will be flushed"); 
fflush(stdout); // Prints to screen or whatever your standard out is 

o

fprintf(fd, "Buffered, will be flushed"); 
fflush(fd); //Prints to a file 

puede ser una técnica muy útil. ¿Por qué querrías vaciar un buffer de salida? Por lo general, cuando lo hago, es porque el código se bloquea y estoy tratando de depurar algo. El búfer estándar no se imprimirá cada vez que llame al printf(), espere hasta que esté lleno y luego vacíe un montón al mismo tiempo. Por lo tanto, si está intentando verificar si está realizando una llamada a función antes de un bloqueo, es útil printf algo así como "¡llegó aquí!", Y algunas veces el búfer no se ha limpiado antes de que ocurra el bloqueo y puede Dime cuán lejos has llegado realmente.

Otra vez que es útil, está en código multiproceso o multiproceso. Una vez más, el búfer no siempre se descarga en una llamada a printf(), por lo que si desea conocer el verdadero orden de ejecución de múltiples procesos, debe enjuagar el búfer después de cada impresión.

Tengo el hábito de hacerlo, me ahorra muchos dolores de cabeza en la depuración. El único inconveniente que se me ocurre es que printf() es una operación costosa (por lo que no vacía el búfer por defecto).


En cuanto a vaciar el búfer de entrada (stdin), no debería hacer eso. Flushing stdin es un comportamiento no definido según la norma C11 §7.21.5.2 parte 2:

Si los puntos de flujo a un flujo de salida ... la función fflush hace que los datos no guardados de esa corriente ... que se escriben en el archivo; de lo contrario, el comportamiento no está definido.

En algunos sistemas, Linux ser uno como se puede ver en la página del manual de fflush(), hay un comportamiento definido pero es dependiente del sistema por lo que su código no será portable.

Ahora, si le preocupa que la basura "se atasque" en el búfer de entrada, puede usar fpurge() en eso. Ver here para más información sobre fflush() y fpurge()

+1

Gracias! ¿Qué hay de stdin (o cualquier otro buffer)? – saadtaame

+0

Ver mi edición (último párrafo), quizás eso ayude. – Mike

+0

Usar 'fflush (stdin)' definitivamente funciona en VS08/10. Ya sea que esté "bien definido" o no, no lo sé. Puede ser una "solución" en VS, porque estoy bastante seguro de que no funcionará en Linux. – ChiefTwoPencils