Wie kann ich Lesen Sie ein Zeichen aus stdin, ohne die enter-Taste drücken?
Möchte ich laufen eine ausführbare Datei, die Blöcke auf stdin und wenn eine Taste gedrückt wird, dass gleiche Zeichen wird sofort gedruckt, ohne Enter gedrückt werden.
Wie kann ich Lesen Sie ein Zeichen aus stdin zimmerreserviereung, ohne das Sie drücken Sie Enter? Angefangen habe ich mit diesem Beispiel:
fn main() {
println!("Type something!");
let mut line = String::new();
let input = std::io::stdin().read_line(&mut line).expect("Failed to read line");
println!("{}", input);
}
Ich sah durch die API und versucht, anstelle read_line()
mit bytes()
, aber alles, was ich versuchen muss ich drücken Sie Enter vor dem Lesen Auftritt.
Diese Frage wurde für C/C++, aber es scheint keinen standard-Weg, es zu tun: Erfassen Zeichen von standard-input, ohne zu warten, für Sie die EINGABETASTE gedrückt werden
Könnte es nicht machbar sein in Rust, da es nicht einfach ist in C/C++.
Sie können die
getch
Funktion aus dem oben genannten link. Sie müssen nur zu kompilieren, die in einem gemeinsamen Objekt, und verwenden Sie es vom Rost: gist.github.com/ihrwein/a4558d63d9250ee0bbf6 Sie benötigen einen C-compiler und es funktioniert nur auf Linux (zumindest habe ich es getestet).InformationsquelleAutor bantl23 | 2014-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie eine der " ncurses-Bibliotheken sind nun verfügbar, zum Beispiel diese.
Fügen Sie die Abhängigkeit im Cargo
und in main.rs:
Folgen Sie den Beispielen in der Bibliothek ncurses initialisieren und warten, für ein einzelnes Zeichen, Eingabe wie diese:
initscr()
wie besprochen here und die there.InformationsquelleAutor Jon Anderson
Während @Jon ' s Lösung, die mit ncurses arbeiten, ncurses löscht den Bildschirm und design. Ich kam mit dieser Lösung, verwendet die termios Kiste für mein kleines Projekt, um zu erfahren Rost. Die Idee ist, ändern
ECHO
undICANON
Fahnen durch den Zugriff auftcsetattr
durch termios-Bindungen.Einen Vorteil Lesen eines einzelnen byte ist die Erfassung Pfeiltasten, Strg usw. Erweiterte F-Tasten sind nicht erfasst (obwohl ncurses kann diese aufzunehmen).
Diese Lösung soll für UNIX-ähnliche Plattformen. Ich habe keine Erfahrung mit Windows, aber nach dieser forum vielleicht etwas ähnliches erreicht werden kann, mit
SetConsoleMode
im Windows.libc::STDIN_FILENO
definiert in derlibc
Kiste statt der Festlegungstdin
selbst.InformationsquelleAutor dojuba
Können Sie auch termion, aber Sie aktivieren müssen, die raw TTY-Modus, welche änderungen das Verhalten der
stdout
als gut. Siehe das Beispiel unten (getestet mit Rost 1.34.0). Beachten Sie, dass intern auch wraps die termios UNIX-API.Cargo.toml
main.rs
InformationsquelleAutor BenC