2013-08-29 6 views
4

Я хочу сделать интерактивное консольное приложение, которое позволяет вводить команду в цикле. Например, пользовательские типы «поиск» и программа находят некоторые данные и распечатывают их на экране. Затем программа ждет следующей команды (которая может быть поиском, выходом или другим). Для удобства пользователя я хочу, чтобы моя программа поддерживала историю команд (например, в терминале, при нажатии стрелки вверх и вниз на клавиатуре). Но я не могу понять, как это сделать, потому что я не знаю, как печатать текст, который можно прочитать дальше scanf, std :: getline, std :: cin и т. Д. Код std::cin << "hello"; не компилирован (не соответствует «operator» < < 'in' std :: cin < < «привет» '). Функция fprintf(stdin, "hello"); ничего не печатает, и scanf не может прочитать это печатное сообщение. Очевидно, что std::getline(std::cin, str); и scanf("%s", s); и gets(s) и т. Д. Не могут читать текст, который был выдан printf или std::out. Поэтому возникает вопрос: как я могу печатать текст на консоли, который также будет в stdin (std::cin)? Или, может быть, есть более элегантный способ организовать историю команд?Как создать историю команд в консольном приложении?

P.S. Я также подумал об имитации нажатия кнопки, чтобы напечатать текст, который мне нужен, но я надеюсь, что есть лучший способ сделать историю команд.

P.P.S. Я использую Linux и C++

+0

Это помогает, когда вы помните, что стандартный ввод-вывод начался в системе без экрана, но с принтером. 'printf' буквально напечатанный текст. Чтобы прочитать это с помощью 'scanf', потребовалось бы, чтобы оператор-человек подавал фактический вывод бумаги на сканер. – MSalters

ответ

3

Используйте readline and history libraries, которые сделаны именно для этой цели.

+0

Обратите внимание, что в версиях GNU для них требуется, чтобы весь код, связанный с ними, лицензировался под лицензией GPL. –

1

Если вы не хотите использовать библиотеку как те Kerrek SB предложили, вы можете подумать в другом направлении:

1) Какие команды должны быть в истории? -> Все команды, пользователь набрал. 2) Откуда вы знаете, что пользователь набрал? -> Вы получаете его из std :: in 3) Что вы делаете с командами, которые вы получаете из std :: in? -> Вы обрабатываете их (например, начинаете поиск, когда пользователь вводит «поиск»)

Дополнительно к шагу 3 вы можете просто сохранить команды, введенные пользователем (например, в каком-либо виде). Если теперь ваш пользователь хочет использовать историю команд и нажимает клавишу «вверх» (или «вниз»), вы просто просматриваете соответствующую команду в своем внутреннем векторе. Затем он «вводит»? Просто обработайте команду, пользователь, выбранный из вашей внутренней истории команд.

+0

Я подумал об этом, но пользователь может захотеть изменить команду перед нажатием «enter». Например, он допустил ошибку в команде и хочет исправить ее и запустить фиксированную команду. Поэтому я могу не только отслеживать кнопки «key up» и «enter». – user2717575