224 votes

Capturer les caractères à partir de l'entrée standard sans attendre que la touche Entrée soit pressée

Je ne peux jamais me rappeler comment je fais cela car cela arrive si rarement pour moi. Mais en C ou C ++, quelle est la meilleure façon de lire un caractère de l'entrée standard sans attendre un retour à la ligne (appuyez sur entrée).

Idéalement, cela ne devrait pas non plus afficher le caractère d'entrée à l'écran. Je veux juste capturer les frappes sans affecter l'écran de la console.

1 votes

@adam - Pouvez-vous clarifier : Voulez-vous une fonction qui retournera immédiatement si aucun caractère n'est disponible, ou une qui attendra toujours une seule pression de touche?

3 votes

@Roddy - Je veux une fonction qui attendra toujours une seule frappe de touche.

4voto

David Thornley Points 39051

C et C++ adoptent une vue très abstraite des E/S, et il n'existe pas de moyen standard de faire ce que vous voulez. Il existe des moyens standard pour obtenir des caractères à partir du flux d'entrée standard, s'il y en a à obtenir, et rien d'autre n'est défini par l'une ou l'autre des langues. Toute réponse devra donc être spécifique à la plateforme, peut-être dépendant non seulement du système d'exploitation mais aussi du framework logiciel.

Il y a ici quelques suppositions raisonnables, mais il n'y a aucun moyen de répondre à votre question sans savoir quel est votre environnement cible.

4voto

Norman Ramsey Points 115730

La chose la plus proche du portable est d'utiliser la ncurses bibliothèque pour mettre le terminal en "mode cbreak". L'API est gigantesque; les routines dont vous aurez le plus besoin sont

  • initscr et endwin
  • cbreak et nocbreak
  • getch

Bonne chance!

3voto

Setu Gupta Points 173

J'ai toujours voulu une boucle pour lire mon entrée sans appuyer sur la touche de retour. ça a fonctionné pour moi.

#include
 main()
 {
   char ch;
    system("stty raw");//seting the terminal in raw mode
    while(1)
     {
     ch=getchar();
      if(ch=='~'){          //terminer ou sortir du mode raw en appuyant sur "~"
      system("stty cooked");
     //while(1);//vous pouvez toujours exécuter le code 
     exit(0); //ou terminer
     }
       printf("vous avez appuyé sur %c\n ",ch);  //écrire le reste du code ici
      }

    }

1 votes

Une fois que vous serez en MODE RAW, il sera difficile de tuer le processus. Alors gardez à l'esprit de tuer le processus comme je l'ai fait "en appuyant sur "~". Sinon, vous pouvez tuer le processus depuis un autre terminal en utilisant KILL.

2voto

PolyThinker Points 3473

Voici une solution extraite de Expert C Programming: Deep Secrets, censée fonctionner sur SVr4. Elle utilise stty et ioctl.

#include <sys/filio.h>
int kbhit()
{
 int i;
 ioctl(0, FIONREAD, &i);
 return i; /* retourne un nombre de caractères disponibles à la lecture */
}
main()
{
 int i = 0;
 intc='';
 system("stty raw -echo");
 printf("entrer 'q' pour quitter \n");
 for (;c!='q';i++) {
    if (kbhit()) {
        c=getchar();
       printf("\n obtenu %c, lors de l'itération %d",c, i);
    }
}
 system("stty cooked echo");
}

2voto

user1438233 Points 36

Fonctionne pour moi sur windows :

#include 
char c = _getch();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X