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, fopen
e _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