Travaillez-vous sous Linux ou Windows? Basé sur cela, il existe des alternatives qui peuvent être utilisées. Si vous travaillez sur Windows, une fonction devrait vous être familière: kbhit()? Bien qu'il soit maintenant obsolète, sa connaissance pratique pourrait être utile :) En supposant que vous travaillez sur Linux, avez-vous essayé NCurses?
de Taken [Ici]: (http://www.linuxmisc.com/9-unix-programmer/d5b30f8d1faf8d82.htm)
Le problème est triple:
- Vous devez vérifier si les données sont disponibles sans bloquer. Un simple 'read' ou fgets 'ou quoi que ce soit va bloquer votre processus jusqu'à ce que les données sont disponibles - vous ne voulez pas cela.
- Vous devez ignorer toute mise en mémoire tampon car sinon vous devrez vérifier à la fois le tampon et le périphérique .
- Vous devez contraindre le pilote de terminal pour vous donner des données comme il est disponible plutôt que d'accumuler le tout dans une ligne .
De la même page:
Cela dit, je vous présente le maladroit, le code hâtivement écrit, décommentée suivant, qui peut être instructif ou non (édité en partie par moi, il manquait entre parenthèses et non indenté)
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
static struct termios orig_term;
void u_cleanup(void)
{
tcsetattr(0, TCSANOW, &orig_term);
}
int u_kbhit(void)
{
struct termios t;
int ret;
fd_set rfd;
struct timeval to;
static int first_hit=0;
if(first_hit==0)
{
if(tcgetattr(0, &t)!=0) exit(0);
orig_term=t;
cfmakeraw(&t);
if(tcsetattr(0, TCSANOW, &t)!=0) exit(0);
atexit(u_cleanup);
first_hit=1;
}
FD_ZERO(&rfd);
FD_SET(0, &rfd);
to.tv_sec=0;
to.tv_usec=0;
if(select(1, &rfd, NULL, NULL, &to)==1) return 1;
return 0;
}
int u_getchar(void)
{
int ret;
fd_set rfc;
unsigned char buf;
if(read(0, &buf, 1)!=1) ret=0;
else ret=buf;
return ret;
}
int main(void)
{
while(1)
{
if(u_kbhit())
{
int key=u_getchar();
printf("hit: %d\r\n", key);
if(key==3)
{
printf("you hit control-c\r\n");
exit(0);
}
}
usleep(100);
}
return 0; // inaccessible code, to prevent compiler warning
}
Oui, c'est possible, mais pas avec std C, ce que vous voulez faire est spécifique au système d'exploitation. Quel est votre système ciblé? – Mike
Si vous parlez de Linux, il y a beaucoup de bibliothèques qui vous permettent de le faire. Ou même vous pouvez lire '/ dev/input/eventX' directement. –
Oui, j'utilise linux 'Raspbian' pour être exact – Yamaha32088