Partilhar via


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

Confira também

E/S de fluxo
fclose, _fcloseall
_flushall
setvbuf