Getch() sous linux

Utilisateur anonyme -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
SAlut, voila comme le titre l'indique, je cherche à utiliser la fonction getch() sous linux......

J'utilise Dev-c++ sous windows, et getch() fonctionne très bien, mais quand je porte mon programme sous linux, patatra tout s'effondre.......

En fait j'ai fait un menu, et je demande à l'utilisateur soit de taper "Entrée" pour continuer, soit de taper "q" pour quitter.
Et c'est donc pour cela entre autres que je ne veux pas utiliser scanf(), car je veux pouvoir taper sur une touche sans avoir a taper sur "Entrée" à la fin !

En C, il me suffit de faire:

int touche;
printf("Appuyez sur une touche : \n");
touche=fgetch();
switch(touche){
case 13 : printf("C'etait la touche Entree \n");
break;
case 97 : printf("C'etait la touche a \n");
break;
case 27 : printf("C'etait la touche Echap \n");
break;
case 113 : printf("C'etait la touche q \n");
break;
default : printf("C'etait autre chose \n");
break;
}

Et tout fonctionne !
Et c'est pour ça que je cherche l'équivalent sous linux.....

J'ai cherché pas mal de temps sur internet, et d'après différentes sources il faudrait inclure des librairies comme curses.h ou ncurses.h, mais finalement on me dit que c'est un genre de librairie qu'il faut jamais utiliser......ensuit on me parle de termios.h et de conio.h, mais en fait on me dit aussi que ces librairies ne sont pas sur tout les systèmes linux et blablabla et blablabla ^^

J'ai même essayé avec getc, fgets et ce genre de chose, mais a chaque fois a la compilation j'ai une erreur....


Pitié aidez-moi ;-) je suis vraiment dans une impasse.......jamais j'aurais pensé que ça me fairait ça en passant sous linux......j'espère qu'il y a une alternative sinon je vais sauter par la fenêtre ^^
A voir également:

6 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
En fait cela ne vient pas du C, mais du terminal. Sous linux il est en mode cooked et il faut le passer en mode raw.
Tu dois utiliser les fonctions cfmakeraw, tcsetattr.
Mais, bon, en général on le laisse en mode cooked sous linux sauf cas spécifique. Les linuxiens aiment bien valider ce qu'ils tapent ;)
2
loupius
 
#include <stdio.h>

int main (int argc, char ** argv)
{
   int touche;
   printf("Appuyez sur une touche : \n");
   touche = fgetc (stdin);
   switch(touche)
   {
      case 0:
         printf("C'etait rien\n");
         break;
      case 13:
         printf("C'etait la touche Entree\n");
         break;
      case 97:
         printf("C'etait la touche a\n");
         break;
      case 27:
         printf("C'etait la touche Echap\n");
         break;
      case 113:
          printf("C'etait la touche q\n");
          break;
       default:
          printf("C'etait autre chose: 0x%2.2X\n", touche);
          break;
   }
   return(0);
}

A ma connaissance, fgetch() n'est pas connu sous Linux; on utilise donc fgetc().
Une précision: sous Linux toute saisie dans un terminal a besoin d'être validée (donc terminée par un retour chariot).
Pour éviter ceci, il est nécessaire de reconfigurer le terminal; pour cela on peut faire: 'stty -cbreak' (voir le man stty).
1
0101101
 
VOILA LA VRAI REPONSE :

Il existe la fonction getchar_unlocked() sous Linux , qui s'utilise comme getch() à savoir :

c=getchar_unlocked();

Tu n'as besoin que de stdio.h pour cette fonction.
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Nan, c'est pas la vraie réponse. Une fonction non bloquante n'a rien à voir avec le fait que l'utilisateur n'a pas besoin de valider par '\n'.

La vraie solution a été donnée, il faut passer le terminal en mode raw. Pas le choix.

Cdlt
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Salut,

C'est pas plutôt getchar() que tu devrais utiliser?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
toujours
 
c'est simple tu fais comme tu as l'envie de faire et c'est ok. tu as tout compris j'espere. bonne soiree
0
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Bonsoir,

Essaie en mettant : #include <wchar.h>

après avoir défini touche : wint_t touche = 0;

et en utilisant l'ordre : touche = _getwch ();

Ca peut marcher avec un peu de chance............
0