IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème de saisie clavier => Vider buffer stdin


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Problème de saisie clavier => Vider buffer stdin
    Bonjour,

    Je vous envoie ce message car j'ai un soucis en langage C pour une saisie clavier.

    J'ai déjà lu plusieurs topics et votre FAQ (http://c.developpez.com/faq/?page=cl...buffer_clavier) concernant mon problème...

    Description :

    Je reprend un code existant qui en gros se résume à cela :

    -Debut de la boucle
    -Saisie clavier à l'aide de gets (c'est mal je sais mais je reprend un code existant)
    -Traitement relativement long...
    -Fin de boucle retour au début.

    On voit bien qu'il y a un soucis ici, en effet si l'utilisateur fait de multiple appuis touche durant la partie traitement le "gets" va les récupérer au passage suivant. (Accumulation dans le buffer).

    Ce que je souhaite donc c'est vider le buffer juste avant de retourner au gets.

    Dans le FAQ il est proposé : clean_stdin ne marche pas car dans mon cas il nécessite un "entrée".
    Je n'utilise pas fflush(stdin) car comportement indéfini et ne marche pas de toute manière (je l'ai quand même testé).

    Info supplémentaires :
    -Plateforme : Linux
    -Compilateur GCC.

    Merci d'avance pour votre aide.

    Redites-moi si vous avez besoin d'autres informations.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Salut

    Si je comprends bien, tu as un utilisateur qui tape des entrées pendant que le programme bosse et tu voudrais purger ces entrées lorsque tu arrives aux questions à poser.
    A la base c'est une très mauvaise idée. Tu ne peux pas présumer que ce qu'à tapé l'utilisateur c'est à jeter. Si l'utilisateur est trop nouille pour attendre que ce soit à lui de taper, alors c'est son problème, pas le tien.

    Mais bon, si vraiment tu veux t'embarquer dans cette politique hasardeuse, alors on peut te proposer le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void vide_clavier()
    {
        while (fgetc(stdin) != EOF);
    }

    Accessoirement, l'excuse de la reprise de code pour justifier gets() est assez pauvre. C'est pas compliqué de remplacer gets() par fgets()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Oui oui, je suis d'accord pour le fgets ^^' ! C'est juste que je cherche à comprendre dans cette configuration, je ne cherche pas d'excuse !

    En passant, merci beaucoup pour ta réponse. Je teste ça !

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Ca ne marche pas...

    En gros, il attend toujours un entrée...

    Voici un code équivalent à ce que je veux faire mais qui ne marche pas....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void clean_stdin(void)
    {
    	int c;
    	do {
    		c = getchar();
    	} while (c != '\n' && c != EOF);
    }
     
     
    int main(int argc, char *argv[]) {
     
    	char toto[128];
     
    	while(1)
    	{
    		clean_stdin();   
    		printf("Enter command: ");
    		fgets(toto,3, stdin);
    		printf("toto = %s\n",toto );
    		sleep(2); // Simule le traitement.
    	}
    	return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neptis Voir le message
    Ca ne marche pas...

    En gros, il attend toujours un entrée...

    Voici un code équivalent à ce que je veux faire mais qui ne marche pas....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    void clean_stdin(void)
    {
    	int c;
    	do {
    		c = getchar();
    	} while (c != '\n' && c != EOF);
    }
     
     
    int main(int argc, char *argv[]) {
     
    	char toto[128];
     
    	while(1)
    	{
    		clean_stdin();   
    		printf("Enter command: ");
    		fgets(toto,3, stdin);
    		printf("toto = %s\n",toto );
    		sleep(2); // Simule le traitement.
    	}
    	return 0;
    }
    Ouaip, c'est vrai que ça marche pas terrible. En fait, si tu tapes "hello" ça t'affiche "he" et ça purge le "llo" mais si tu tapes des trucs entre temps, ça ne les purge pas

    Tu devrais aller voir du coté des ioctl. Matafan est assez calé là-dedans...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Ce qu'il faut faire c'est vider le buffer après l'appel de fgets, et si et seulement si il est besoin de le vider en plus. Cela est très bien expliquée dans cette entrée de la FAQ.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/10/2015, 17h09
  2. [C] vider le buffer stdin
    Par canBelive dans le forum C
    Réponses: 8
    Dernier message: 05/05/2013, 19h21
  3. Problème saisie clavier
    Par PP(Team) dans le forum C++
    Réponses: 2
    Dernier message: 05/04/2007, 10h56
  4. Richeditctrl - problème de saisie clavier
    Par KO-Tek dans le forum MFC
    Réponses: 5
    Dernier message: 20/12/2005, 11h15
  5. Saisie clavier marche pas
    Par Dokho1000 dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 11/03/2004, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo