Rinçage des tampons en C

fflush() ne devrait-il pas être utilisé pour vider un tampon même s’il s’agit d’un stream de sortie?

À quoi sert-il? Comment pouvons-nous vider un tampon en général?

Je n’ai jamais entendu parler de vider le tampon de sortie, et cela m’intéresserait d’entendre votre source à ce sujet. Rinçage des tampons de sortie:

 printf("Buffered, will be flushed"); fflush(stdout); // Prints to screen or whatever your standard out is 

ou

 fprintf(fd, "Buffered, will be flushed"); fflush(fd); //Prints to a file 

Peut être une technique très utile. Pourquoi voudriez-vous vider un tampon de sortie? Habituellement, quand je le fais, c’est parce que le code plante et que j’essaie de déboguer quelque chose. Le tampon standard ne s’imprimera pas à chaque fois que vous appelez printf() il attend jusqu’à ce qu’il soit plein puis vide un paquet à la fois. Donc, si vous essayez de vérifier si vous faites un appel de fonction avant un crash, il est utile d’ printf quelque chose comme “got here!”, Et parfois le tampon n’a pas été vidé avant le crash et vous pouvez Ne dites pas jusqu’où vous êtes vraiment arrivé.

Une autre fois, c’est utile, en code multi-processus ou multi-thread. Encore une fois, le tampon ne videra pas toujours un appel à un printf() , donc si vous voulez connaître le véritable ordre d’exécution de plusieurs processus, vous devez effacer le tampon après chaque impression.

J’ai l’habitude de le faire, cela me permet d’économiser beaucoup de maux de tête lors du débogage. Le seul inconvénient auquel je peux penser est que printf() est une opération coûteuse (c’est pourquoi elle ne vide pas le tampon par défaut).


En ce qui concerne le vidage du tampon d’entrée ( stdin ), vous ne devriez pas le faire. Le rinçage stdin est un comportement indéfini selon la norme C11 § 7.21.5.2 partie 2:

Si le stream pointe vers un stream de sortie … la fonction fflush provoque l’écriture dans le fichier des données non écrites pour ce stream; sinon, le comportement est indéfini.

Sur certains systèmes, Linux en est un, comme vous pouvez le voir dans la page de manuel de fflush() , il y a un comportement défini, mais cela dépend du système, donc votre code ne sera pas portable.

Maintenant, si vous craignez que les ordures ne soient “bloquées” dans le tampon de saisie, vous pouvez utiliser fpurge() . Voir ici pour plus d’informations sur fflush() et fpurge()