Nigdy nie pamiętam, jak to robię, ponieważ tak rzadko mi się to zdarza. Ale w C lub C ++, jaki jest najlepszy sposób na odczytanie znaku ze standardowego wejścia bez czekania na znak nowej linii (naciśnij enter).
Idealnie byłoby również, gdyby nie powodował echa wprowadzanego znaku na ekranie. Chcę tylko przechwytywać naciśnięcia klawiszy bez wpływu na ekran konsoli.
c++
c
inputstream
Adam
źródło
źródło
Odpowiedzi:
Nie jest to możliwe w sposób przenośny w czystym C ++, ponieważ zbytnio zależy to od używanego terminala, z którym może być połączony
stdin
(są one zwykle buforowane liniowo). Możesz jednak użyć do tego biblioteki:conio dostępny z kompilatorami Windows. Użyj
_getch()
funkcji, aby nadać znak bez czekania na klawisz Enter. Nie jestem częstym programistą systemu Windows, ale widziałem, jak moi koledzy z klasy po prostu go dołączają<conio.h>
i używają. Zobaczconio.h
w Wikipedii. Zawiera listęgetch()
, która jest uznana za przestarzałą w programie Visual C ++.curses dostępne dla systemu Linux. Zgodne implementacje curses są również dostępne dla systemu Windows. Pełni też
getch()
funkcję. (spróbujman getch
wyświetlić jego stronę podręcznika). Zobacz Curses w Wikipedii.Zalecałbym użycie curses, jeśli dążysz do kompatybilności między platformami. To powiedziawszy, jestem pewien, że istnieją funkcje, których można użyć do wyłączenia buforowania w trybie offline (uważam, że nazywa się to „trybem surowym”, w przeciwieństwie do „trybu gotowanego” - spójrz na
man stty
). Przekleństwa załatwiłyby to dla ciebie w przenośny sposób, jeśli się nie mylę.źródło
ncurses
jest zalecanym wariantemcurses
.W Linuksie (i innych systemach typu unix) można to zrobić w następujący sposób:
Zasadniczo musisz wyłączyć tryb kanoniczny (i tryb echa, aby stłumić echo).
źródło
read
. Zawarłem oba nagłówki.error: ‘perror’ was not declared in this scope
podczas kompilacji, ale działa dobrze, gdy jest dołączonystdio.h
wraz zunistd.h
.Znalazłem to na innym forum, szukając rozwiązania tego samego problemu. Trochę go zmodyfikowałem z tego, co znalazłem. Działa świetnie. Używam OS X, więc jeśli używasz Microsoft, musisz znaleźć prawidłowe polecenie system (), aby przełączyć się na tryb surowy i gotowany.
źródło
#include <stdlib.h>
CONIO.H
potrzebne funkcje to:
libconio http://sourceforge.net/projects/libconio
lub
Implementacja conio.h w Linux C ++ http://sourceforge.net/projects/linux-conioh
źródło
Jeśli korzystasz z systemu Windows, możesz użyć PeekConsoleInput, aby wykryć, czy jest jakieś wejście,
następnie użyj ReadConsoleInput, aby „wykorzystać” znak wejściowy.
szczerze mówiąc, pochodzi to ze starego kodu, który mam, więc musisz trochę przy nim bawić.
Fajne jest jednak to, że czyta dane wejściowe bez pytania o nic, więc znaki nie są w ogóle wyświetlane.
źródło
Służy
kbhit()
do sprawdzania, czy klawiatura jest naciskana igetch()
do uzyskania naciśniętego znaku.źródło
Zakładając Windows, przyjrzyj się funkcji ReadConsoleInput .
źródło
C i C ++ mają bardzo abstrakcyjny pogląd na operacje we / wy i nie ma standardowego sposobu robienia tego, co chcesz. Istnieją standardowe sposoby pobierania znaków ze standardowego strumienia wejściowego, jeśli są jakieś do pobrania, i nic innego nie jest zdefiniowane przez żaden z języków. Dlatego każda odpowiedź będzie musiała być specyficzna dla platformy, być może zależna nie tylko od systemu operacyjnego, ale także od struktury oprogramowania.
Są tutaj rozsądne domysły, ale nie ma sposobu, aby odpowiedzieć na twoje pytanie, nie wiedząc, jakie jest twoje docelowe środowisko.
źródło
Używam kbhit (), aby sprawdzić, czy znak jest obecny, a następnie getchar (), aby odczytać dane. W systemie Windows możesz użyć „conio.h”. W Linuksie będziesz musiał zaimplementować własną kbhit ().
Zobacz kod poniżej:
źródło
Najbliższą rzeczą do przenośnych jest użycie
ncurses
biblioteki do wprowadzenia terminala w „tryb cbreak”. API jest gigantyczne; najbardziej pożądane są proceduryinitscr
iendwin
cbreak
inocbreak
getch
Powodzenia!
źródło
Poniżej znajduje się rozwiązanie wyodrębnione z Expert C Programming: Deep Secrets , które ma działać na SVr4. Używa stty i ioctl .
źródło
Zawsze chciałem, aby pętla odczytywała moje dane wejściowe bez naciskania klawisza Return. to działało dla mnie.
źródło
ncurses zapewnia dobry sposób na zrobienie tego! Jest to również mój pierwszy post (który pamiętam), więc wszelkie komentarze są mile widziane. Docenię przydatne, ale zapraszamy wszystkich!
do kompilacji: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
źródło
działa u mnie na windows:
źródło
Możesz to zrobić przenośnie za pomocą SDL (Simple DirectMedia Library), chociaż podejrzewam, że możesz nie lubić jego zachowania. Kiedy próbowałem, musiałem poprosić SDL o utworzenie nowego okna wideo (mimo że nie potrzebowałem go w moim programie) i sprawić, by to okno „przechwytywało” prawie wszystkie dane z klawiatury i myszy (co było w porządku w moim przypadku, ale być irytujące lub niewykonalne w innych sytuacjach). Podejrzewam, że to przesada i nie warto, chyba że całkowita przenośność jest koniecznością - w przeciwnym razie wypróbuj jedno z innych sugerowanych rozwiązań.
Nawiasem mówiąc, to da ci osobne naciśnięcie i zwolnienie klawiszy, jeśli jesteś w tym.
źródło
Oto wersja, która nie trafia do systemu (napisana i przetestowana na macOS 10.14)
źródło