Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2829 connectés 

  FORUM HardWare.fr
  Programmation

  [C] fflush ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] fflush ?

n°179252
chaica
Posté le 20-07-2002 à 19:35:46  profilanswer
 

J'ai lu les précédents topics mais j'ai une question.
 
Après chaque saisie, que ce soit à l'aide de scanf ou getchar, que ce soit pour une chaine ou un caractère, il faut mettre un fflush(stdin) pour nettoyer le flux d'entree c'est ca?
 
Je demande parce que j'ai des \n qui trainent et ca me saoule grave.
 
CHaiCA

mood
Publicité
Posté le 20-07-2002 à 19:35:46  profilanswer
 

n°179255
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-07-2002 à 19:46:56  profilanswer
 

moi je le ferais avant d'executer scanf et autres...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°179263
koulip31
Posté le 20-07-2002 à 20:13:10  profilanswer
 

antp a écrit a écrit :

moi je le ferais avant d'executer scanf et autres...




moi jutilise pas de scanf et autre :D ke des func a moi a base de read write au moin la ya de petard
sinon effectivment faut ke tu flush a chaque fois

n°179279
antp
Super Administrateur
Champion des excuses bidons
Posté le 20-07-2002 à 20:29:51  profilanswer
 

moi non plus j'utilise pas ça, mais bon... :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°179281
chaica
Posté le 20-07-2002 à 20:30:08  profilanswer
 

C'est vraiment bizarre car je n'utilise que des scanf et des getcharet à chaque fois je vide avec fflush(stdin)  
Mais il reste toujours un \n  
 
CHaiCA

n°179294
LetoII
Le dormeur doit se réveiller
Posté le 20-07-2002 à 21:12:35  profilanswer
 

Oui tu doit faire un flush aporès chaque récupération d'entrée sur l'entrée standard pour virer les caractères que tu n'as pas utilisés


---------------
Le Tyran
n°179316
chaica
Posté le 20-07-2002 à 23:12:07  profilanswer
 

Ok merci, je vais approfondir...
 
CHaiCA

n°179783
LeGreg
Posté le 22-07-2002 à 10:57:47  profilanswer
 

moi j'trouve ca pas tres cool comme style de prog
mais bon c'est vous qui decidez comment doivent tourner
vos programmes..
 
LeGreg

n°179790
LetoII
Le dormeur doit se réveiller
Posté le 22-07-2002 à 11:04:10  profilanswer
 

Par ce que tu trouve plus cool de laisser des cochonerie derrière toi sur le flux d'entré peut-être?
C'est la seule manière propre de procéder à mon avis, il faut laisser les choses dans l'état ou tu les a trouver ( en tout cas la plus part du temps)


---------------
Le Tyran
n°179809
LeGreg
Posté le 22-07-2002 à 11:21:51  profilanswer
 

En fait, je concois un programme,  
je me demande comment il doit tourner:
- on a un flux d'entree qui correspond a une frappe
sur le clavier par l'utilisateur. La question c'est  
pourquoi l'utilisateur a tapé des choses inutiles sur son clavier? Peut-etre que le comportement du programme est a revoir la.
- toujours dans le cas d'une frappe sur le clavier: j'ai un utilisateur qui a tendance a taper plus vite que les questions n'apparaissent parce qu'il connait les questions par coeur et c'est un gain de productivité de frapper sans attendre. Seul probleme le programme vide le buffer entre chaque entrée ce qui fait qu'apres s'etre fait avoir plusieurs fois l'utilisateur devra se resoudre a attendre patiemment chaque question posée par le programme (mais frustration tout de meme).
- cas un peu différent: le programme lit sur l'entree standard qui pour une fois provient d'un fichier ou d'une sortie d'un programme. le flush correspond a vider le buffer de lecture, ce qui peut avoir un comportement indéfini si ce n'est pas prévu par le programme et c'est probablement dependant de la plateforme. De meme si l'entrée provient du reseau, le buffer se remplit a la vitesse ou les paquets arrivent.  
 
Donc a mon avis, le flush, si flush il y a, doit correspondre a un besoin bien precis fixé par le programme et pas fixé par des regles "je flushe avant chaque lecture".
 
LeGreg

mood
Publicité
Posté le 22-07-2002 à 11:21:51  profilanswer
 

n°179825
LetoII
Le dormeur doit se réveiller
Posté le 22-07-2002 à 11:34:14  profilanswer
 

Quand tu redirige lun fichier vers l'entrée standard le flush ne pose pas de pb.Les autres cas sont des cas particuliers et effectivement quand on programme c bien de réfléchir un minimum, quoi qu'on fasse. De plus dans la majorité des cas faire systèmatiquement un flush après un récupération sur l'entrée standard t'évite bien des bugs à la con, ensuite si tu veux implémenter un comportement bien particulier dans un prog ok tu peux t'en affranchir, mais faut bien faire gaffe à ce que tu fais si tu veux pas avoir de surprise, mais on retombe dans un cas particulier là.


---------------
Le Tyran
n°179862
LeGreg
Posté le 22-07-2002 à 12:08:31  profilanswer
 

habituellement ce genre de probleme arrive parce que le programmeur ne sait pas trop ce que fait "scanf"  
(je deconseillerais aussi d'utiliser gets aussi mais pour d'autres raisons)
 
Voici un exemple de code faux(qui ne fait pas ce que le programmeur veut):

Code :
  1. printf("Entrez un nombre:" );
  2. scanf("%d", &nombre);
  3. printf("Entrez une phrase:" );
  4. gets(phrase);
  5. printf("Vous avez tapé %d et \"%s\"\n", nombre, phrase);


 
scanf va retourner des que l'utilisateur aura appuyé sur la touche entrée. Mais son travail aura été de convertir tout ce qu'il aura pu convertir à partir de la chaine format, en fait il va arreter de lire sur le flux d'entree standard des que les caractères lus sur l'entrée standard vont differer de la chaine format. Donc ici, si l'utilisateur tape "10\n", il va s'arreter apres le caractere '0' et laisser '\n' dans le buffer de lecture.
 
Le mieux a faire c'est donc de  
1- verifier la valeur de retour de scanf pour verifier que l'utilisateur a bien rentré un nombre valide.  
2- lire les caractères d'entrée un a un jusqu'a ce qu'on tombe sur '\n', il est possible que l'utilisateur ait tapé des espaces inutiles apres le dernier chiffre.
 
Je sais bien que les debutants se fichent de ce qu'il "faudrait faire" et veulent un programme qui tourne sans trop de prise de tete.  
Mais dans la vraie vie, un programme qui tourne c'est un programme qui fait ce qu'il doit faire en toute circonstances.
En ce qui me concerne, j'écris un programme qui lit un fichier contenant des données formatées pour mes besoins personnels. j'utilise fscanf et sscanf parce que c'est bien utile mais j'essaie de tenir compte de leurs spécificités parce qu'un octet lu en trop ou en moins ca change beaucoup de choses.
 
LeGreg

n°179907
zi_ril_wan​ou
Posté le 22-07-2002 à 13:37:54  profilanswer
 

legreg a écrit a écrit :

habituellement ce genre de probleme arrive parce que le programmeur ne sait pas trop ce que fait "scanf"  
(je deconseillerais aussi d'utiliser gets aussi mais pour d'autres raisons)
 
Voici un exemple de code faux(qui ne fait pas ce que le programmeur veut):

Code :
  1. printf("Entrez un nombre:" );
  2. scanf("%d", &nombre);
  3. printf("Entrez une phrase:" );
  4. gets(phrase);
  5. printf("Vous avez tapé %d et \"%s\"\n", nombre, phrase);


 
scanf va retourner des que l'utilisateur aura appuyé sur la touche entrée. Mais son travail aura été de convertir tout ce qu'il aura pu convertir à partir de la chaine format, en fait il va arreter de lire sur le flux d'entree standard des que les caractères lus sur l'entrée standard vont differer de la chaine format. Donc ici, si l'utilisateur tape "10\n", il va s'arreter apres le caractere '0' et laisser '\n' dans le buffer de lecture.
 
Le mieux a faire c'est donc de  
1- verifier la valeur de retour de scanf pour verifier que l'utilisateur a bien rentré un nombre valide.  
2- lire les caractères d'entrée un a un jusqu'a ce qu'on tombe sur '\n', il est possible que l'utilisateur ait tapé des espaces inutiles apres le dernier chiffre.
 
Je sais bien que les debutants se fichent de ce qu'il "faudrait faire" et veulent un programme qui tourne sans trop de prise de tete.  
Mais dans la vraie vie, un programme qui tourne c'est un programme qui fait ce qu'il doit faire en toute circonstances.
En ce qui me concerne, j'écris un programme qui lit un fichier contenant des données formatées pour mes besoins personnels. j'utilise fscanf et sscanf parce que c'est bien utile mais j'essaie de tenir compte de leurs spécificités parce qu'un octet lu en trop ou en moins ca change beaucoup de choses.
 
LeGreg




 
Tout à fait d'accord avec toi LeGreg.
Perso, je ne fait que des lectures "bufferisées" (fgets puis sscanf) ça evite pas mal de merdes aussi.  

n°179933
LetoII
Le dormeur doit se réveiller
Posté le 22-07-2002 à 14:12:57  profilanswer
 

De toute manière on pourrait débatre de ça pendant des heures, sans pour autant arriver à qqc de constructif. Je pense qu'il n'y a pas de solution toute faites et que ce genre de truc se règle au cas par cas suivant ses besoins.


Message édité par LetoII le 22-07-2002 à 14:14:06

---------------
Le Tyran

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C] fflush ?

 

Sujets relatifs
[C] Les fflush(stdin) ca se met où concrètement ?[c] pb de fflush
Plus de sujets relatifs à : [C] fflush ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)