Condividi tramite


fflush

Scarica un flusso.

Sintassi

int fflush(
   FILE *stream
);

Parametri

stream
Puntatore alla struttura FILE .

Valore restituito

fflush restituisce 0 se il buffer è stato scaricato correttamente. Il valore 0 viene restituito anche nel caso in cui il flusso specificato non ha nessun buffer o viene aperto in sola lettura. Un valore restituito di EOF indica un errore.

Nota

Se fflush restituisce EOF, i dati potrebbero essere andati persi a causa di un errore di scrittura. Quando si configura un gestore degli errori critici, è consigliabile disattivare il buffering con la funzione setvbuf o usare routine I/O di basso livello, ad esempio _open, _close e _write anziché le funzioni I/O del flusso.

Osservazioni:

La funzione fflush scarica il flusso stream. Se il flusso è stato aperto in modalità di scrittura o è stato aperto in modalità di aggiornamento e l'ultima operazione è stata una scrittura, fflush scrive il contenuto del buffer del flusso nel file o nel dispositivo sottostante e il buffer viene rimosso. Se il flusso è stato aperto in modalità di lettura o se il flusso non ha buffer, la chiamata a fflush non ha alcun effetto e qualsiasi buffer viene mantenuto. Una chiamata a fflush annulla l'effetto di qualsiasi chiamata precedente a ungetc per il flusso. Il flusso rimane aperto dopo la chiamata.

Se stream è NULL, il comportamento è lo stesso di una chiamata a fflush su ogni flusso aperto. Tutti i flussi aperti in modalità scrittura e in modalità aggiornamento in cui l'ultima operazione è stata un'operazione di scrittura vengono scaricati. La chiamata non ha effetto su altri flussi.

I buffer sono normalmente gestiti dal sistema operativo, il quale determina il momento ottimale per scrivere automaticamente i dati sul disco: quando un buffer è pieno, quando un flusso viene chiuso o quando un programma termina normalmente senza chiudere i flussi. La funzionalità di commit al disco della libreria di runtime consente di assicurare che i dati critici siano scritti direttamente su disco anziché nei buffer del sistema operativo. Senza riscrivere un programma esistente, è possibile abilitare questa funzionalità collegando i file oggetto del programma con COMMODE.OBJ. Nel file eseguibile risultante, le chiamate a _flushall scrivono il contenuto di tutti i buffer sul disco. Solo _flushall e fflush sono interessati da COMMODE.OBJ.

Per informazioni sul controllo della funzionalità di commit su disco, vedere I/O di Flusso, fopene _fdopen.

Questa funzione blocca il thread che chiama e quindi è thread-safe. Per una versione che non blocca il thread, vedere _fflush_nolock.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Funzione Intestazione obbligatoria
fflush <stdio.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

// 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

Vedi anche

I/O di flusso
fclose, _fcloseall
_flushall
setvbuf