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

 


Dernière réponse
Sujet : [C] fflush ?
LetoII 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.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
LetoII 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.
zi_ril_wanou

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.  

LeGreg 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

LetoII 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à.
LeGreg 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
LetoII 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)
LeGreg moi j'trouve ca pas tres cool comme style de prog
mais bon c'est vous qui decidez comment doivent tourner
vos programmes..
 
LeGreg
chaica Ok merci, je vais approfondir...
 
CHaiCA
LetoII 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
chaica 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
antp moi non plus j'utilise pas ça, mais bon... :D
koulip31

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

antp moi je le ferais avant d'executer scanf et autres...
chaica 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

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