Partage via


fflush

Vide un flux.

Syntaxe

int fflush(
   FILE *stream
);

Paramètres

stream
Pointeur vers la structure FILE .

Valeur retournée

fflush retourne 0 si la mémoire tampon a été vidée correctement. La valeur 0 est également retournée si le flux spécifié n’a aucune mémoire tampon ou est ouvert en lecture seule. Une valeur de retour égale à EOF indique une erreur.

Remarque

Si fflush retourne EOF, des données ont peut-être été perdues en raison d’un échec d’écriture. Quand vous configurez un gestionnaire d’erreurs critiques, la procédure la plus sûre consiste à désactiver la mise en mémoire tampon avec la fonction setvbuf ou à utiliser des routines E/S de bas niveau comme _open, _close et _write au lieu de fonctions d’E/S de flux.

Notes

La fonction fflush vide le flux stream. Si le flux a été ouvert en mode écriture ou s’il a été ouvert en mode mise à jour et que la dernière opération était une écriture, fflush écrit le contenu de la mémoire tampon de flux dans le fichier ou l’appareil sous-jacent, et la mémoire tampon est ignorée. Si le flux a été ouvert en mode de lecture ou qu’il n’a pas de mémoire tampon, l’appel à fflush n’a aucun effet, et aucune mémoire tampon n’est conservée. Un appel à fflush annule l’effet d’un appel antérieur à ungetc pour le flux. Le flux reste ouvert après l’appel.

Si stream est NULL, le comportement est identique à un appel à fflush sur chaque flux ouvert. Tous les flux ouverts en mode d’écriture et tous les flux ouverts en mode de mise à jour où la dernière opération était une écriture sont vidés. L’appel n’a aucun effet sur les autres flux.

Les mémoires tampons sont normalement gérées par le système d’exploitation, qui détermine à quel moment les données doivent être automatiquement écrites sur le disque : quand une mémoire tampon est saturée, quand un flux est fermé ou quand un programme se termine normalement sans fermer le flux. La fonctionnalité de validation sur disque de la bibliothèque runtime garantit que les données critiques sont écrites directement sur le disque plutôt que dans les mémoires tampons du système d’exploitation. Sans réécrire un programme existant, vous pouvez activer cette fonctionnalité en liant les fichiers objet du programme avec COMMODE.OBJ. Dans le fichier exécutable résultant, les appels à _flushall écrivent le contenu de toutes les mémoires tampons sur le disque. Seuls _flushall et fflush sont affectés par COMMODE.OBJ.

Pour plus d’informations sur le contrôle de la fonctionnalité commit-to-disk, consultez Flux d’E/S, fopenet _fdopen.

Cette fonction verrouille le thread appelant et est donc thread-safe. Pour une version sans verrouillage, voir _fflush_nolock.

Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.

Spécifications

Fonction En-tête requis
fflush <stdio.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

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

Voir aussi

E/S de flux
fclose, _fcloseall
_flushall
setvbuf