104 votes

Comment simuler "Appuyez sur n'importe quelle touche pour continuer ?"

Je suis en train d'essayer d'écrire un programme C++ dans lequel lorsque l'utilisateur entre un caractère depuis le clavier, cela devrait passer à la ligne suivante du code.

Voici mon code :

char c;

cin>>c;

cout<<"Quelque chose"<

`

mais cela ne fonctionne pas, car il ne passe à la ligne suivante que lorsque j'entre un caractère puis appuie sur ENTRÉE.

OU

Si j'utilise cela

cin.get() ou cin.get(c)

cela passe à la ligne suivante de l'instruction lorsque j'appuie sur ENTRÉE.

Mais je voulais que cela passe à la ligne suivante lorsqu'une touche est pressée sur le clavier, comment cela peut-il être fait ?

`

5voto

Kirill V. Lyadvinsky Points 47627

Pour réaliser cette fonctionnalité, vous pourriez utiliser la bibliothèque ncurses qui a été implémentée à la fois sur Windows et Linux (et MacOS autant que je sache).

5voto

Lucas Points 5723

J'ai examiné ce que vous essayez d'accomplir, car je me souviens avoir voulu faire la même chose. Inspiré par Vinay, j'ai écrit quelque chose qui fonctionne pour moi et que je comprends un peu. Mais je ne suis pas un expert, alors s'il vous plaît soyez prudent.

Je ne sais pas comment Vinay sait que vous utilisez Mac OS X. Mais cela devrait fonctionner un peu de cette façon avec la plupart des systèmes d'exploitation de type unix. Une ressource vraiment utile est opengroup.org

Assurez-vous de vider le tampon avant d'utiliser la fonction.

#include 
#include         //termios, TCSANOW, ECHO, ICANON
#include      //STDIN_FILENO

void pressKey()
{
    //la structure termios stocke toutes sortes de drapeaux qui peuvent manipuler l'interface E/S
    //J'en ai une ancienne pour sauvegarder les anciens paramètres et une nouvelle
    static struct termios oldt, newt;
    printf("Appuyez sur une touche pour continuer....\n");

    //tcgetattr obtient les paramètres du terminal actuel
    //STDIN_FILENO indique à tcgetattr qu'il doit écrire les paramètres
    //de stdin dans oldt
    tcgetattr( STDIN_FILENO, &oldt);
    //maintenant les paramètres seront copiés
    newt = oldt;

    //deux des c_lflag seront désactivés
    //ECHO est responsable de l'affichage de l'entrée de l'utilisateur dans le terminal
    //ICANON est essentiel! Normalement, cela garantit qu'une ligne à la fois sera traitée
    //cela signifie qu'il retournera s'il voit un "\n" ou un EOF ou une EOL
    newt.c_lflag &= ~(ICANON | ECHO );      

    //Ces nouveaux paramètres seront définis sur STDIN
    //TCSANOW indique à tcsetattr de changer les attributs immédiatement.
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);

    //maintenant, le caractère sera demandé
    getchar();

    //les anciens paramètres seront réécrits dans STDIN
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);

}

int main(void)
{
  pressKey();
  printf("FIN\n");
  return 0;
}

O_NONBLOCK semble également être un indicateur important, mais cela n'a rien changé pour moi.

J'apprécierais que des personnes ayant une connaissance plus approfondie commentent cela et donnent quelques conseils.

4voto

John Doe Points 141

Si vous utilisez Visual Studio 2012 ou une version antérieure, utilisez la fonction getch(), si vous utilisez Visual Studio 2013 ou une version plus récente, utilisez _getch(). Vous devrez utiliser #include . Exemple :

#include 
#include 

int main()
{
   std::cout << "Appuyez sur une touche pour continuer. . .\n";
   _getch(); //Ou getch()
}

3voto

Rohit Points 2629

Ceci fonctionne sur une plateforme Windows: Il utilise les registres du microprocesseur directement et peut être utilisé pour vérifier les touches enfoncées ou le bouton de la souris

    #include
    #include
    #include
    void main()
    {
     clrscr();
     union REGS in,out;
     in.h.ah=0x00;
     printf("Appuyez sur une touche : ");

     int86(0x16,&in,&out);
     printf("Ascii : %d\n",out.h.al);
     char ch = out.h.al;
     printf("Caractère enfoncé : %c",&ch);
     printf("Code de balayage : %d",out.h.ah);
     getch();
    }

2voto

Nick Dandoulakis Points 26809

Vous pouvez utiliser la routine getchar.

À partir du lien ci-dessus :

/* exemple de getchar : machine à écrire */
#include 

int main ()
{
  char c;
  puts ("Entrez du texte. Inclure un point ( '.') dans une phrase pour sortir :");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}

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