[C] fflush ?

fflush ? [C] - Programmation

Marsh Posté le 20-07-2002 à 19:35:46    

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

Reply

Marsh Posté le 20-07-2002 à 19:35:46   

Reply

Marsh Posté le 20-07-2002 à 19:46:56    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-07-2002 à 20:13:10    

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

Reply

Marsh Posté le 20-07-2002 à 20:29:51    

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-07-2002 à 20:30:08    

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

Reply

Marsh Posté le 20-07-2002 à 21:12:35    

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
Reply

Marsh Posté le 20-07-2002 à 23:12:07    

Ok merci, je vais approfondir...
 
CHaiCA

Reply

Marsh Posté le 22-07-2002 à 10:57:47    

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

Reply

Marsh Posté le 22-07-2002 à 11:04:10    

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
Reply

Marsh Posté le 22-07-2002 à 11:21:51    

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

Reply

Marsh Posté le 22-07-2002 à 11:21:51   

Reply

Marsh Posté le 22-07-2002 à 11:34:14    

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
Reply

Marsh Posté le 22-07-2002 à 12:08:31    

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

Reply

Marsh Posté le 22-07-2002 à 13:37:54    

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.  

Reply

Marsh Posté le 22-07-2002 à 14:12:57    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed