2012-09-16 4 views
41

fflush() ne doit-il pas être utilisé pour vider un tampon même s'il s'agit d'un flux de sortie?Tampons de rinçage dans C

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

+0

noter que juste fflush n'est bien défini pour les flux de sortie, il ne peut pas être utilisé sur les flux d'entrée: ce serait un comportement non défini. – Lundin

+0

@Lundin Est-il correct de l'utiliser pour vider les flux de sortie? – saadtaame

+2

@saadtaame Oui, c'est exactement ce à quoi 'fflush()' est destiné. – Mysticial

Répondre

75

Je n'ai jamais entendu pour vider le tampon de sortie, et je serais intéressé d'entendre votre source à ce sujet. Flushing les 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 j'essaye de déboguer quelque chose. Le tampon standard ne s'imprime 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 passez à un appel de fonction avant un accident, il est utile de printf quelque chose comme "arrivé ici!", Et parfois le tampon n'a pas été vidé avant l'accident et vous pouvez Ne dites pas jusqu'où vous êtes vraiment arrivé.

Une autre fois que c'est utile, est dans le code multi-processus ou multi-thread. Encore une fois, le tampon ne videra pas toujours sur un appel à printf(), donc si vous voulez connaître le véritable ordre d'exécution de plusieurs processus, vous devez fflush le tampon après chaque impression. Je fais l'habitude de le faire, cela me sauve beaucoup de maux de tête dans le débogage. Le seul inconvénient que je peux penser à faire est que printf() est une opération coûteuse (c'est pourquoi il ne vide pas par défaut le tampon).


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

Si les points de flux à un flux de sortie ... la fonction fflush provoque pas de données non écrites de ce flux ... doivent être écrites le fichier; sinon, le comportement est indéfini.

Sur certains systèmes, Linux et BSD comme vous pouvez le voir dans la page de manuel pour fflush(), il y a un comportement défini mais il est dépendant du système de sorte que votre code ne sera pas portable.

Maintenant, si vous êtes inquiet à propos des déchets "bloqués" dans le tampon d'entrée, vous pouvez utiliser fpurge() sur cela. Voir here pour plus sur fflush() et fpurge()

+1

Merci! Que diriez-vous de stdin (ou tout autre tampon)? – saadtaame

+0

Voir ma modification (dernier paragraphe), peut-être que cela aidera. – Mike

+0

L'utilisation de 'fflush (stdin)' fonctionne très certainement dans VS08/10. Que ce soit «bien défini» ou non, je ne sais pas. Cela peut être une "solution" dans VS, parce que je suis à peu près certain que ça ne marchera pas sur Linux. – ChiefTwoPencils