fflush
Libera um fluxo.
Sintaxe
int fflush(
FILE *stream
);
Parâmetros
stream
Ponteiro para a estrutura FILE
.
Valor retornado
fflush
retorna 0 se o buffer foi liberado com êxito. O valor 0 também é retornado em casos em que o fluxo especificado não tem nenhum buffer ou está aberto para acesso somente leitura. Um valor retornado EOF
indica um erro.
Observação
Se fflush
retorna EOF
, os dados podem ter sido perdidos devido a uma falha de gravação. Ao configurar um manipulador de erro crítico, é mais seguro desativar o buffer com a função setvbuf
ou usar rotinas de E/S de nível inferior como _open
, _close
e _write
em vez das funções de E/S de fluxo.
Comentários
A função fflush
libera o fluxo stream
. Se o fluxo foi aberto no modo de gravação ou foi aberto no modo de atualização e a última operação foi uma gravação, fflush
grava o conteúdo do buffer de fluxo no arquivo ou dispositivo subjacente e o buffer é descartado. Se o fluxo foi aberto no modo de leitura ou se o fluxo não tem nenhum buffer, a chamada para fflush
não tem nenhum efeito e nenhum buffer é mantido. Uma chamada para fflush
anula o efeito de qualquer chamada anterior a ungetc
para o fluxo. O fluxo permanecerá aberto após a chamada.
Se stream
é NULL
, o comportamento é o mesmo que uma chamada para fflush
em cada fluxo aberto. Todos os fluxos abertos no modo de gravação e todos os fluxos abertos no modo de atualização em que a última operação foi uma gravação são liberados. A chamada não tem efeito em outros fluxos.
Normalmente, esses buffers são mantidos pelo sistema operacional, que determina o momento ideal para gravar os dados automaticamente no disco: quando um buffer estiver cheio, quando um fluxo for fechado ou quando um programa for encerrado normalmente sem fechar fluxos. O recurso de confirmar no disco da biblioteca em tempo de execução permite assegurar que dados críticos sejam gravados diretamente no disco em vez de em buffers do sistema operacional. Sem reescrever um programa existente, você pode habilitar esse recurso vinculando os arquivos de objeto do programa com COMMODE.OBJ
. No arquivo executável resultante, chamadas para _flushall
gravam o conteúdo de todos os buffers no disco. Somente _flushall
e fflush
são afetados por COMMODE.OBJ
.
Para obter informações sobre como controlar o recurso de confirmação em disco, confira E/S de fluxo, fopen
e _fdopen
.
Essa função bloqueia o thread de chamada e, portanto, é thread-safe. Para uma versão sem bloqueio, consulte _fflush_nolock
.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Requisitos
Função | Cabeçalho necessário |
---|---|
fflush |
<stdio.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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