fflush
Vacía una secuencia.
Sintaxis
int fflush(
FILE *stream
);
Parámetros
stream
Puntero a la estructura FILE
.
Valor devuelto
fflush
devuelve 0 si el búfer se ha vaciado correctamente. También se devuelve el valor 0 en los casos en que la secuencia especificada no tiene ningún búfer o solo se abre para lectura. Un valor devuelto de EOF
indica un error.
Nota:
Si fflush
devuelve EOF
, es posible que se hayan perdido datos debido a un error de escritura. Al configurar un controlador de errores críticos, resulta más seguro desactivar el almacenamiento en búfer con la función setvbuf
o usar rutinas de E/S de bajo nivel, como _open
, _close
y _write
, en lugar de las funciones de E/S de secuencia.
Comentarios
La función fflush
vacía la secuencia stream
. Si la secuencia se abrió en modo de escritura o se abrió en modo de actualización y la última operación fue una escritura, fflush
escribe el contenido del búfer de secuencia en el archivo o dispositivo subyacente y se descarta el búfer. Si la secuencia se ha abierto en modo de lectura, o no tiene ningún búfer, la llamada a fflush
no tiene ningún efecto y no se conserva ningún búfer. Una llamada a fflush
anula el efecto de cualquier llamada anterior a ungetc
en la secuencia. La secuencia sigue abierta después de la llamada.
Si stream
es NULL
, el comportamiento es igual al de una llamada a fflush
en cada secuencia abierta. Se vacían todas las secuencias abiertas en modo de escritura y en modo de actualización en las que la última operación ha sido de escritura. La llamada no tiene ningún efecto en otras secuencias.
Normalmente, el sistema operativo mantiene los búferes y determina el momento óptimo para escribir los datos automáticamente en el disco: cuando el búfer está lleno, cuando se cierra una secuencia o cuando un programa finaliza con normalidad sin cerrar la secuencia. La característica de confirmación en disco de la biblioteca en tiempo de ejecución permite asegurarse de que los datos críticos se escriben directamente en el disco y no en los búferes del sistema operativo. Sin tener que volver a escribir un programa existente, puede habilitar esta característica mediante la vinculación de los archivos objeto del programa a COMMODE.OBJ
. En el archivo ejecutable resultante, las llamadas a _flushall
escriben el contenido de todos los búferes en el disco. COMMODE.OBJ
solo afecta a _flushall
y fflush
.
Para obtener información sobre cómo controlar la característica de confirmación en disco, consulte E/S de secuencia, fopen
y _fdopen
.
Esta función bloquea el subproceso de llamada y por lo tanto es segura para subprocesos. Para consultar una versión que no realiza el bloqueo, vea _fflush_nolock
.
De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.
Requisitos
Función | Encabezado necesario |
---|---|
fflush |
<stdio.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_fflush.c
// Compile with: cl /W4 crt_fflush.c
// This sample gets a number from the user, then writes it to a file.
// It ensures the write isn't lost on crash by calling fflush.
#include <stdio.h>
int * crash_the_program = 0;
int main(void)
{
FILE * my_file;
errno_t err = fopen_s(&my_file, "myfile.txt", "w");
if (my_file && !err)
{
printf("Write a number: ");
int my_number = 0;
scanf_s("%d", &my_number);
fprintf(my_file, "User selected %d\n", my_number);
// Write data to a file immediately instead of buffering.
fflush(my_file);
if (my_number == 5)
{
// Without using fflush, no data was written to the file
// prior to the crash, so the data is lost.
*crash_the_program = 5;
}
// Normally, fflush is not needed as closing the file will write the buffer.
// Note that files are automatically closed and flushed during normal termination.
fclose(my_file);
}
return 0;
}
5
User selected 5