Я никогда не могу вспомнить, как я это делаю, потому что это случается так редко для меня. Но в C или C ++, как лучше всего читать символ из стандартного ввода, не дожидаясь перевода строки (нажмите ввод).
Также в идеале это не будет отображать вводимый символ на экране. Я просто хочу захватить нажатия клавиш без влияния на экран консоли.
c++
c
inputstream
Адам
источник
источник
Ответы:
В чистом C ++ это невозможно сделать переносимым способом, потому что он слишком сильно зависит от используемого терминала, с которым можно соединиться
stdin
(обычно это буферизованная линия). Однако вы можете использовать библиотеку для этого:Conio доступен с компиляторами Windows. Используйте
_getch()
функцию, чтобы дать вам символ, не дожидаясь клавиши Enter. Я не частый разработчик Windows, но я видел, как мои одноклассники просто включают<conio.h>
и используют его. Смотритеconio.h
в Википедии. В нем перечислены спискиgetch()
, которые объявлены устаревшими в Visual C ++.проклятия доступны для Linux. Совместимые реализации curses доступны и для Windows. У него также есть
getch()
функция. (попробуйтеman getch
просмотреть его справочную страницу). Смотрите Проклятия в Википедии.Я бы порекомендовал вам использовать curses, если вы стремитесь к кроссплатформенности. Тем не менее, я уверен, что есть функции, которые вы можете использовать для отключения буферизации линии (я полагаю, что это называется «сырой режим», а не «приготовленный режим» - посмотрите
man stty
). Проклятия справились бы с тобой портативно, если я не ошибаюсь.источник
ncurses
это рекомендуемый вариантcurses
.В Linux (и других unix-подобных системах) это можно сделать следующим образом:
В основном вы должны отключить канонический режим (и режим эха, чтобы подавить эхо).
источник
read
. Я включил оба заголовка.error: ‘perror’ was not declared in this scope
при компиляции, но отлично работает, когда включаетсяstdio.h
вместе сunistd.h
.Я нашел это на другом форуме, пытаясь решить ту же проблему. Я немного изменил это из того, что нашел. Работает отлично. Я использую OS X, поэтому, если вы работаете с Microsoft, вам нужно найти правильную команду system (), чтобы переключиться в сырой и готовый режимы.
источник
#include <stdlib.h>
conio.h
функции, которые вам нужны:
libconio http://sourceforge.net/projects/libconio
или
Linux con ++ реализация conio.h http://sourceforge.net/projects/linux-conioh
источник
Если вы находитесь в Windows, вы можете использовать PeekConsoleInput, чтобы обнаружить, есть ли какие-либо входные данные,
затем используйте ReadConsoleInput, чтобы «потреблять» вводимый символ.
если честно, это из какого-то старого кода, который у меня есть, так что вам придется немного поиграться с ним.
Крутая вещь, хотя это то, что он читает ввод без запроса чего-либо, поэтому символы не отображаются вообще.
источник
Используется
kbhit()
для проверки нажатия клавиши иgetch()
для получения нажимаемого символа.источник
Предполагая Windows, взгляните на функцию ReadConsoleInput .
источник
C и C ++ имеют очень абстрактное представление о вводе / выводе, и не существует стандартного способа делать то, что вы хотите. Существуют стандартные способы получения символов из стандартного потока ввода, если они есть, и ни один другой язык не определен. Поэтому любой ответ должен быть специфичным для платформы, возможно, в зависимости не только от операционной системы, но и от структуры программного обеспечения.
Здесь есть некоторые разумные догадки, но нет способа ответить на ваш вопрос, не зная, какова ваша целевая среда.
источник
Я использую kbhit (), чтобы увидеть, присутствует ли char, а затем getchar (), чтобы прочитать данные. В Windows вы можете использовать «conio.h». В Linux вы должны будете реализовать свой собственный kbhit ().
Смотрите код ниже:
источник
Самое близкое к портативному - использовать
ncurses
библиотеку для перевода терминала в «режим cbreak». API гигантский; процедуры, которые вы хотите больше всего,initscr
иendwin
cbreak
иnocbreak
getch
Удачи!
источник
Ниже приведено решение, извлеченное из Expert C Programming: Deep Secrets , которое должно работать на SVr4. Он использует stty и ioctl .
источник
Я всегда хотел, чтобы цикл считывал мой ввод без нажатия клавиши возврата. это сработало для меня.
источник
ncurses предоставляет хороший способ сделать это! Также это мой самый первый пост (который я помню), поэтому любые комментарии приветствуются. Я буду признателен за полезные, но все приветствуются!
для компиляции: g ++ -std = c ++ 11 -pthread -lncurses .cpp -o
источник
у меня работает на windows:
источник
Вы можете сделать это с помощью SDL (Simple DirectMedia Library), хотя я подозреваю, что вам может не понравиться его поведение. Когда я попробовал это, мне нужно было, чтобы SDL создал новое видеоокно (хотя оно мне и не понадобилось для моей программы) и чтобы это окно «захватывало» почти весь ввод с клавиатуры и мыши (что было хорошо для моего использования, но могло быть раздражающим или неработающим в других ситуациях). Я подозреваю, что это излишне и не стоит, если полная мобильность не является обязательной - в противном случае попробуйте одно из других предложенных решений.
Кстати, это даст вам нажатие клавиш и отдельно отпустить события, если вы в этом заинтересованы.
источник
Вот версия, которая не распространяется на систему (написана и протестирована на macOS 10.14)
источник