Ввод в реальном времени с клавиатуры на консоль (в Windows)? - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть двусвязный класс списка, в котором я хочу добавлять символы в список по мере того, как пользователь их вводит, или удалять последний узел в списке каждый раз, когда пользователь нажимает клавишу Backspace, в то время как результаты отображаются в консоли в реальном времени.-time.

Какие функции я бы использовал для перехвата индивидуального ввода с клавиатуры и отображения его в режиме реального времени на консоли?Таким образом, следующие результаты:

Пользователь начинает печатать:

Typ_

Пользователь прекращает печатать:

Печатать это наscreen_

Пользователь нажимает клавишу Backspace 5 раз:

Печатая это на s_

Особой ОС являются окна (в частности, Vista).

В качестве дополнительного примечания GetAsyncKeyState под windows.h, возможно, предназначено для ввода с клавиатуры, однако проблема отображения консоли в реальном времени остается.

Ответы [ 3 ]

4 голосов
/ 22 сентября 2011

C ++ не имеет понятия «клавиатура».Он имеет только непрозрачный ФАЙЛ, называемый "stdin", из которого вы можете читать.Тем не менее, содержимое этого «файла» заполняется вашей средой, в частности вашим терминалом.

Большинство терминалов буферизуют строку ввода перед отправкой ее присоединенному процессу, поэтому вы никогда не сможете увидеть существование пробелов,Что вам действительно нужно, так это получить контроль над терминалом напрямую.

Это очень зависимая от платформы процедура, и вы должны указать свою платформу, если вам нужен конкретный совет.В Linux попробуйте ncurses или termios.

2 голосов
/ 23 сентября 2011

Вы будете удивлены, но этот код будет делать то, что вы хотите:

/* getchar example : typewriter */
#include <stdio.h>

int main ()
{
  char c;
  puts ("Enter text. Include a dot ('.') in a sentence to exit:");
  do {
    c=getchar();
    putchar (c);
  } while (c != '.');
  return 0;
}
2 голосов
/ 22 сентября 2011

Вы можете использовать ReadConsoleInput, добавляя входящие символы в свой список, ищите клавиши возврата (INPUT_RECORD-> KEY_EVENT_RECORD.wVirtualScanCode == VK_BACKSPACE) и удаляя последний символ из вашего списка для всех им.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...