2015-12-22 6 views
1

У меня недавно возникла проблема с std::cin, где, когда я пытаюсь использовать его в сочетании с std::this_thread::sleep_for(), он начинает получать ввод, когда он даже не был вызван все же.std :: cin recieve input, когда он не должен

Вот код, я использую:

#include <iostream> 
#include <chrono> 
#include <thread> 
#include <string> 

using std::string 
using namespace std::this_thread 
using namespace std::chrono 

int main(){ 
    string a; 
    sleep_for(seconds(3)); //start typing around now 
    std::cin >> a;   //the text typed during the sleep_for() shows up now 
    return 0; 
} 

Когда вы начинаете набирать во время sleep_for(), текст только появляется потом, когда std::cin называется. Мне было интересно, знает ли кто, как это исправить и почему это происходит.

+1

Это сама консоль, а не 'std :: cin'. Он будет делать то же самое для программ, написанных на других языках. – chris

+0

http://stackoverflow.com/questions/257091/how-do-i-flush-the-cin-buffer что-то вроде этого, возможно? – Amomum

+0

@Amomum Я думаю, что OP ожидает, что текст даже не появится. –

ответ

2

Причина это проявляется в том, что есть два компонента, участвующие и они работают независимо друг от друга:

  • Вторым компонентом является программа. Все, что он обычно делает, это его внутренние вещи и общение снаружи через stdin, stdout и stderr.
  • Первым компонентом является консоль (терминал [эмулятор], командная строка, поле DOS .. для этого есть разные имена), который фактически отображает вывод из вашей программы и который получает ввод с клавиатуры для вашей программы.

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

Теперь, что вы можете с этим сделать? Во-первых, вы можете написать свою собственную консоль, которая ведет себя так, как вам бы хотелось, но это далеко не тривиально. Во-вторых, есть способы связи с консолью с помощью так называемых escape-последовательностей. Эти последовательности, например. позволяют отображать цвета или жирные шрифты, но они не стандартизированы, поэтому они зависят от консоли, поэтому получение надежных результатов также нетривиально. Однако существуют библиотеки для таких, например, «проклятия» и различные другие с похожими именами. Они даже позволяют создавать текстовые окна внутри консоли, и это должны быть те, на которые нужно смотреть.

+0

Есть ли эквивалент проклятий для Windows? После очень быстрого поиска Google я обнаружил, что библиотеки проклятия предназначены для Unix-систем. –

+0

Сделайте менее быстрый поиск, например. https://stackoverflow.com/questions/138153/is-ncurses-available-for-windows появился как один из первых моих результатов. –

0

В Linux вы могли бы сделать что-то вроде этого:

... 
std::cin >> a;   //the text typed during the sleep_for() shows up now 
cout << "\e[A";. // move cursor up 

for(size_t i=0; i<a.size(); i++){ 
    cout << "\b \b"; // erase one character 
} 

Вот сказал на Linux sleep_for не останавливает набранный текст показывать сразу.

Я не уверен, есть ли эквивалент окон для перемещения курсора вверх.

+0

Можете ли вы найти ссылку, чтобы объяснить эти escape-последовательности?Кроме того, они зависят от используемой консоли и доступны сотни из них. –

+0

@UlrichEckhardt, я получил это от этого вопроса http://stackoverflow.com/questions/10058050/how-to-go-up-a-line-in-console-programs-c – Amomum

Смежные вопросы