Je ne me souviens jamais comment je fais cela parce que cela me revient si rarement. Mais en C ou C ++, quelle est la meilleure façon de lire un caractère à partir d'une entrée standard sans attendre une nouvelle ligne (appuyez sur Entrée).
Idéalement également, il ne ferait pas écho au caractère d'entrée à l'écran. Je veux juste capturer des frappes sans affecter l'écran de la console.
c++
c
inputstream
Adam
la source
la source
Réponses:
Ce n'est pas possible de manière portable en C ++ pur, car cela dépend trop du terminal utilisé qui peut être connecté
stdin
(ils sont généralement mis en tampon en ligne). Vous pouvez cependant utiliser une bibliothèque pour cela:conio disponible avec les compilateurs Windows. Utilisez la
_getch()
fonction pour vous donner un caractère sans attendre la touche Entrée. Je ne suis pas un développeur Windows fréquent, mais j'ai vu mes camarades de classe simplement l'inclure<conio.h>
et l'utiliser. Voirconio.h
sur Wikipedia. Il répertoriegetch()
, qui est déclaré obsolète dans Visual C ++.curses disponibles pour Linux. Des implémentations de curses compatibles sont également disponibles pour Windows. Il a également une
getch()
fonction. (essayezman getch
de voir sa page de manuel). Voir les malédictions sur Wikipedia.Je vous recommanderais d'utiliser des malédictions si vous visez une compatibilité multiplateforme. Cela dit, je suis sûr qu'il existe des fonctions que vous pouvez utiliser pour désactiver la mise en mémoire tampon de la ligne (je crois que cela s'appelle "mode brut", par opposition au "mode cuisiné" - regardez dans
man stty
). Les malédictions géreraient cela pour vous de manière portable, si je ne me trompe pas.la source
ncurses
est la variante recommandée decurses
.Sur Linux (et d'autres systèmes de type Unix), cela peut être fait de la manière suivante:
En gros, vous devez désactiver le mode canonique (et le mode écho pour supprimer l'écho).
la source
read
. J'ai inclus les deux en-têtes.error: ‘perror’ was not declared in this scope
lors de la compilation, mais fonctionne bien lorsqu'il est inclusstdio.h
avecunistd.h
.J'ai trouvé cela sur un autre forum en cherchant à résoudre le même problème. Je l'ai un peu modifié par rapport à ce que j'ai trouvé. Cela fonctionne très bien. J'utilise OS X, donc si vous exécutez Microsoft, vous devrez trouver la bonne commande system () pour passer aux modes brut et cuit.
la source
#include <stdlib.h>
CONIO.H
les fonctions dont vous avez besoin sont:
libconio http://sourceforge.net/projects/libconio
ou
Implémentation Linux C ++ de conio.h http://sourceforge.net/projects/linux-conioh
la source
Si vous êtes sous Windows, vous pouvez utiliser PeekConsoleInput pour détecter s'il y a une entrée,
puis utilisez ReadConsoleInput pour "consommer" le caractère d'entrée.
pour être honnête, cela provient d'un ancien code que j'ai, vous devez donc le manipuler un peu.
Ce qui est cool, c'est qu'il lit les entrées sans rien demander, de sorte que les caractères ne sont pas affichés du tout.
la source
Cela permet
kbhit()
de vérifier si le clavier est enfoncé et utilisegetch()
pour obtenir le caractère qui est enfoncé.la source
En supposant que Windows, jetez un œil à la fonction ReadConsoleInput .
la source
C et C ++ ont une vue très abstraite des E / S et il n'y a pas de méthode standard pour faire ce que vous voulez. Il existe des moyens standard d'obtenir des caractères 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 plate-forme, peut-être dépendant non seulement du système d'exploitation, mais également du cadre logiciel.
Il y a des suppositions raisonnables ici, mais il n'y a aucun moyen de répondre à votre question sans savoir quel est votre environnement cible.
la source
J'utilise kbhit () pour voir si un caractère est présent, puis getchar () pour lire les données. Sous Windows, vous pouvez utiliser "conio.h". Sous Linux, vous devrez implémenter votre propre kbhit ().
Voir le code ci-dessous:
la source
La chose la plus proche du portable est d'utiliser la
ncurses
librairie pour mettre le terminal en "mode cbreak". L'API est gigantesque; les routines que vous voudrez le plus sontinitscr
etendwin
cbreak
etnocbreak
getch
Bonne chance!
la source
Ce qui suit est une solution extraite de la programmation Expert C: Deep Secrets , qui est censé fonctionner sur SVr4. Il utilise stty et ioctl .
la source
J'ai toujours voulu une boucle pour lire mon entrée sans appuyer sur la touche retour. cela a fonctionné pour moi.
la source
ncurses fournit un bon moyen de faire cela! C'est aussi mon tout premier message (dont je me souviens), donc tous les commentaires sont les bienvenus. J'apprécierai ceux qui sont utiles, mais tous sont les bienvenus!
pour compiler: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
la source
fonctionne pour moi sur Windows:
la source
Vous pouvez le faire de manière portable en utilisant SDL (la bibliothèque Simple DirectMedia), même si je soupçonne que vous n'aimerez peut-être pas son comportement. Quand je l'ai essayé, j'ai dû demander à SDL de créer une nouvelle fenêtre vidéo (même si je n'en avais pas besoin pour mon programme) et de faire en sorte que cette fenêtre «saisisse» presque toutes les entrées du clavier et de la souris (ce qui convenait à mon utilisation mais pouvait être ennuyeux ou irréalisable dans d’autres situations). Je soupçonne que c'est exagéré et ne vaut pas la peine à moins qu'une portabilité complète ne soit un must - sinon essayez l'une des autres solutions suggérées.
À propos, cela vous donnera les événements de pression et de libération des touches séparément, si vous aimez cela.
la source
Voici une version qui ne s'applique pas au système (écrite et testée sur macOS 10.14)
la source