Bonjour
je débute en C et je voudrai comprendre l'utilité de la fonction de fflush() ainsi que la différence entre fflush(stdin) et fflush(stdout), sachant que je travaille sous linux
Bonjour
je débute en C et je voudrai comprendre l'utilité de la fonction de fflush() ainsi que la différence entre fflush(stdin) et fflush(stdout), sachant que je travaille sous linux
Salut,
Ça vide le tampon d'entrée. Supposons qu'un programme te demande 4 flottants et que tu en rentres 5. Si tu ne vides pas le tampon d'entrée, tu peux être sûr qu'a la prochaine demande le programme utilisera ton cinquième flottant au lieu de ta future réponse.
Ça vide le tampon de sortie. Supposons que toutes les secondes tu sauves la température dans un fichier csv. En fait, le tampon n'est réellement écrit dans le fichier que si on a suffisamment d'octets pour écrire un secteur. Si une coupure de courant arrive juste avant qu'on ait assez d'octets pour remplir en secteur, le secteur est perdu. Le flush force l'écriture réelle, même si le secteur n'est pas plein.
Sauf erreur c'est la librairie standard, le comportement est le même quelque soit la plateforme.
A+
Pfeuh
Ah d'accord, parce que moi j'ai un problème au niveau de mon application, en fait j'utilise deux threads, l'un client et l'autre serveur, ainsi que la fonction "bcopy" dans les deux threads...le problème c'est que quand le serveur copie sur la mémoire partagée, le client récupère les données de la mémoire partagé mais en retard...ce qui fait que je récupère les données mais pas au bon moment.
Il y a 2 entrées intéressantes dans la FAQ concernant ce problème :
- A quoi sert la fonction fflush ?
- Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?
Comme il ne faut pas utiliser fflush() pour vider le buffer d'entrée, son comportement étant indéterminé, il existe d'autres méthodes pour vider le buffer du clavier, notamment celle décrite dans la FAQ :
D'ailleurs, puisqu'on en parle, cette technique ne provoque t-elle pas une boucle infinie si le buffer est déjà vide ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <stdio.h> void clean_stdin(void) { int c; do { c = getchar(); } while (c != '\n' && c != EOF); }
Elle est à utiliser avec précaution : Si le buffer est vide, on va bloquer intempestivement sur le getchar() jusqu'à ce qu'on tape une ligne ou EOF.
J'ai eu le soucis une fois dans un programme. Je l'ai appelé "par acquis" de conscience avant une lecture... Il faut donc l'appeler que si on est sûr que le buffer n'est pas vide, ce qui est un peu contraignant. Y a t-il un moyen de la rendre non bloquante ?
Pour compléter ce que l'on dit au-dessus, fflush sert à « vider » un buffer en acheminant immédiatement les données qu'il contient vers leur destination finale. Il n'a jamais été question « d'effacer » un buffer. « fflush(stdin) » est indéterminé parce que ça n'a pas de sens : la destination finale des données d'un buffer d'entrée est justement le processus qui a appelé fflush(). S'il ne les lit pas, il n'y a aucun raison que cela bouge.
Le problème est que, comme le C définit cette action comme étant indéfinie et que de nombreuses personnes font l'amalgame entre fflush(stdin) et fflush(stdout), on trouve certaines bibliothèques qui vident quand même le buffer d'entrée, et c'est un problème car c'est une erreur et cela empêche le programmeur de s'en rendre compte immédiatement.
On en parlait ici :
http://www.developpez.net/forums/d11...f/#post6098688
http://www.developpez.net/forums/d10...r/#post5982737
Dans le 2e sujet, vous parlez de modifier l'entrée de la FAQ sur "vider le buffer clavier". La solution que tu proposes, Obsidian, ne devrait-elle pas être ajoutée, elle aussi ?
En fait, j'aimerais la d'abord la soumettre à l'appréciation des autres visiteurs et des vrais experts du site. En plus, elle utilise des fonctions standard sur pour ainsi dire tous les Unix et Posix, mais elle n'est pas strictement C standard. Il faudrait la valider sur d'autres plateformes…
Partager