Ich kann mich nie erinnern, wie ich das mache, weil es für mich so selten vorkommt. Aber was ist in C oder C ++ der beste Weg, um ein Zeichen aus der Standardeingabe zu lesen, ohne auf eine neue Zeile zu warten (drücken Sie die Eingabetaste).
Idealerweise wird das eingegebene Zeichen auch nicht auf dem Bildschirm angezeigt. Ich möchte nur Tastenanschläge erfassen, ohne den Konsolenbildschirm zu beeinträchtigen.
c++
c
inputstream
Adam
quelle
quelle
Antworten:
Dies ist in reinem C ++ nicht portabel möglich, da es zu stark vom verwendeten Terminal abhängt, mit dem eine Verbindung hergestellt werden kann
stdin
(diese sind normalerweise zeilengepuffert). Sie können jedoch eine Bibliothek dafür verwenden:conio mit Windows-Compilern verfügbar. Verwenden Sie die
_getch()
Funktion, um Ihnen ein Zeichen zu geben, ohne auf die Eingabetaste zu warten. Ich bin kein häufiger Windows-Entwickler, aber ich habe gesehen, dass meine Klassenkameraden es einfach einschließen<conio.h>
und verwenden. Sieheconio.h
bei Wikipedia. Es werden Listen aufgelistetgetch()
, die in Visual C ++ als veraltet deklariert sind.Flüche für Linux verfügbar. Kompatible Curses-Implementierungen sind auch für Windows verfügbar. Es hat auch eine
getch()
Funktion. (Versuchen Sieman getch
, die Manpage anzuzeigen). Siehe Flüche bei Wikipedia.Ich würde Ihnen empfehlen, Flüche zu verwenden, wenn Sie plattformübergreifende Kompatibilität anstreben. Ich bin mir jedoch sicher, dass es Funktionen gibt, mit denen Sie die Zeilenpufferung ausschalten können (ich glaube, das wird als "Rohmodus" bezeichnet, im Gegensatz zum "Kochmodus" - schauen Sie hinein
man stty
). Flüche würden das für Sie auf tragbare Weise erledigen, wenn ich mich nicht irre.quelle
ncurses
die empfohlene Variante von istcurses
.Unter Linux (und anderen Unix-ähnlichen Systemen) kann dies folgendermaßen erfolgen:
Grundsätzlich müssen Sie den kanonischen Modus deaktivieren (und den Echo-Modus, um das Echo zu unterdrücken).
quelle
read
. Ich habe beide Header eingefügt.error: ‘perror’ was not declared in this scope
beim Kompilieren, funktioniert aber gut, wenn esstdio.h
zusammen mit enthalten istunistd.h
.Ich habe dies in einem anderen Forum gefunden, als ich versucht habe, das gleiche Problem zu lösen. Ich habe es ein bisschen von dem geändert, was ich gefunden habe. Es funktioniert großartig. Ich verwende OS X. Wenn Sie also Microsoft ausführen, müssen Sie den richtigen Befehl system () finden, um in den Roh- und Kochmodus zu wechseln.
quelle
#include <stdlib.h>
CONIO.H
Die Funktionen, die Sie benötigen, sind:
libconio http://sourceforge.net/projects/libconio
oder
Linux c ++ Implementierung von conio.h http://sourceforge.net/projects/linux-conioh
quelle
Wenn Sie unter Windows arbeiten, können Sie PeekConsoleInput verwenden, um festzustellen, ob Eingaben vorhanden sind.
Verwenden Sie dann ReadConsoleInput, um das Eingabezeichen zu "verbrauchen".
Um ehrlich zu sein, stammt dies aus einem alten Code, den ich habe, also muss man ein bisschen damit herumspielen.
Das Coole ist jedoch, dass Eingaben gelesen werden, ohne dass Sie dazu aufgefordert werden, sodass die Zeichen überhaupt nicht angezeigt werden.
quelle
Dies wird verwendet
kbhit()
, um zu überprüfen, ob die Tastatur gedrückt wird, undgetch()
um das Zeichen zu erhalten, das gedrückt wird.quelle
Angenommen, Windows, sehen Sie sich die ReadConsoleInput- Funktion an.
quelle
C und C ++ sehen E / A sehr abstrakt, und es gibt keine Standardmethode, um das zu tun, was Sie wollen. Es gibt Standardmethoden, um Zeichen aus dem Standardeingabestream abzurufen, falls vorhanden, und nichts anderes wird von beiden Sprachen definiert. Jede Antwort muss daher plattformspezifisch sein, möglicherweise nicht nur vom Betriebssystem, sondern auch vom Software-Framework.
Hier gibt es einige vernünftige Vermutungen, aber es gibt keine Möglichkeit, Ihre Frage zu beantworten, ohne zu wissen, was Ihre Zielumgebung ist.
quelle
Ich benutze kbhit (), um zu sehen, ob ein Zeichen vorhanden ist, und dann getchar (), um die Daten zu lesen. Unter Windows können Sie "conio.h" verwenden. Unter Linux müssen Sie Ihr eigenes kbhit () implementieren.
Siehe Code unten:
quelle
Am nächsten an Portable ist es, die
ncurses
Bibliothek zu verwenden, um das Terminal in den "cbreak-Modus" zu versetzen. Die API ist gigantisch; Die Routinen, die Sie am meisten wollen, sindinitscr
undendwin
cbreak
undnocbreak
getch
Viel Glück!
quelle
Das Folgende ist eine Lösung, die aus der Expert C-Programmierung extrahiert wurde : Deep Secrets , die auf SVr4 funktionieren soll. Es verwendet stty und ioctl .
quelle
Ich wollte immer, dass eine Schleife meine Eingabe liest, ohne die Eingabetaste zu drücken. das hat bei mir funktioniert.
quelle
ncurses bietet eine gute Möglichkeit, dies zu tun! Dies ist auch mein allererster Beitrag (an den ich mich erinnern kann), daher sind Kommentare überhaupt willkommen. Ich werde nützliche schätzen, aber alle sind willkommen!
zum Kompilieren: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
quelle
funktioniert für mich unter Windows:
quelle
Sie können dies portabel mit SDL (der Simple DirectMedia Library) tun, obwohl ich vermute, dass Ihnen das Verhalten möglicherweise nicht gefällt. Als ich es ausprobierte, musste SDL ein neues Videofenster erstellen (obwohl ich es für mein Programm nicht benötigte) und dieses Fenster fast alle Tastatur- und Mauseingaben "greifen" (was für meine Verwendung in Ordnung war, aber konnte) in anderen Situationen ärgerlich oder nicht praktikabel sein). Ich vermute, es ist übertrieben und es lohnt sich nicht, es sei denn, vollständige Portabilität ist ein Muss - ansonsten versuchen Sie es mit einer der anderen vorgeschlagenen Lösungen.
Übrigens, dies gibt Ihnen die Möglichkeit, Ereignisse einzeln zu drücken und freizugeben, wenn Sie sich dafür interessieren.
quelle
Hier ist eine Version, die nicht an das System weitergegeben wird (geschrieben und getestet unter macOS 10.14).
quelle