Si vous êtes sur Windows, vous pouvez utiliser _kbhit()
qui fait partie de la bibliothèque d'exécution Microsoft. Si vous êtes sur Linux, vous pouvez l'implémenter. Cité ici, voici le code :
#include
#include
#include
#include
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
return 0;
}
Mise à jour : La fonction ci-dessus fonctionne sur OS X (au moins, sur OS X 10.5.8 - Leopard, donc je m'attends à ce qu'elle fonctionne sur des versions plus récentes d'OS X). Ce gist peut être enregistré sous le nom kbhit.c
et compilé à la fois sur Linux et sur OS X avec
gcc -o kbhit kbhit.c
Lorsque vous exécutez avec
./kbhit
Il vous invite à appuyer sur une touche, et se termine lorsque vous appuyez sur une touche (pas limité à Entrée ou touches imprimables).
@Johnsyweb - veuillez préciser ce que vous entendez par "réponse canonique détaillée" et "toutes les préoccupations". De plus, concernant "multiplateforme" : avec cette implémentation de kbhit()
, vous pouvez avoir la même fonctionnalité dans un programme C++ sur Linux/Unix/OS X/Windows - à quelles autres plateformes pourriez-vous faire référence ?
Mise à jour supplémentaire pour @Johnsyweb : Les applications C++ ne vivent pas dans un environnement C++ hermétiquement fermé. Une grande raison du succès du C++ est l'interopérabilité avec le C. Toutes les plateformes principales sont implémentées avec des interfaces C (même si l'implémentation interne utilise le C++) donc votre discours sur "l'héritage" semble déplacé. De plus, comme nous parlons d'une seule fonction, pourquoi avez-vous besoin de C++ pour cela ("C avec des classes") ? Comme je l'ai souligné, vous pouvez écrire en C++ et accéder facilement à cette fonctionnalité, et les utilisateurs de votre application se soucieront rarement de la façon dont vous l'avez implémentée.