2016-09-28 8 views
1

Мое приложение считывает ввод пользователя с использованием std::cin потока. В одном месте я хотел бы предоставить ввод по умолчанию и позволить пользователю принять его как есть (нажав enter) или изменить его перед продолжением (удалив старые символы с обратным пространством и добавив новый текст).Предоставление значения по умолчанию для ввода cin

Я знаю, что символы могут быть помещены непосредственно в cin.rdbuf, но это не совсем то, чего я хочу достичь. Я хотел бы поместить символов в консольное окно в том месте, где курсор консоли находится в ожидании ввода пользователя и не читать их, прежде чем пользователь их примет. Пользователь должен также удалить их и написать собственный текст.

Может ли быть что-то подобное достигнуто с помощью cin или мне нужно имитировать это, читая отдельные символы и перекрашивая содержимое консоли?

+0

Если вы хотите иметь что-то например, предварительно заполненные маски экрана, а не поиск [ncurses] (http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html). –

+0

Для этого вам понадобится какая-то консольная библиотека, например [Microsoft] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682073%28v=vs.85%29.aspx? f = 255 и MSPPError = -2147217396) для Windows или [libreadline] (https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) или [ncurses] (https: //en.wikipedia. org/wiki/Ncurses) – kfsone

ответ

4

Нет, что-то подобное не может быть сделано с std::cin. Его буфер чтения считывается непосредственно со стандартного ввода. Стандартный ввод - это «приготовленный» поток символов. Все редактирование полностью обрабатывается терминальной консолью вашей операционной системы, а нажатие Enter приводит к отображению std::cin вашего приложения, введя введенный текст.

Традиционный способ это сделать, это просто указать входное значение по умолчанию в самой строке, и использовать значение по умолчанию в случае пустого ввода, что-то вроде:

std::string buffer; 

std::cout << "What color is the sky [blue]? "; 

std::getline(std::cin, buffer); 

if (buffer.size() == 0) 
     buffer="blue"; 
+0

Спасибо за объяснение. Однако ваш пример не будет работать в моем случае, потому что моя цель - запретить пользователю принуждать писать весь текст, когда они хотят немного изменить его. Например: [по умолчанию]: _someReallyLongName1_ [пользовательский ввод]: _someReallyLongName2_ – leggo