Kbhit с++

Функция kbhit проверяет наличие ввода с клавиатуры (нажатие клавиши).
Работает код:
void main()
     {
       printf("Приготовившись, нажмите любую клавишуn");
       while(!kbhit());
       printf("n Была нажата клавиша (%c)n"); _getch();
     }
Тогда почему не работает код, записывающий число в I как только оно было набрано?
int main()
{
setlocale(LC_CTYPE, "");
int i=0;
cout << "Введи число: ";
while(!(_kbhit())){
cin >> i;
}
cout << "Введенное число " << i;
cout << endl; system("pause"); return 0;
}

Заранее спасибо  

3 комментария: Kbhit с++

  1. safright говорит:

    Потому что ты не знаешь основ языка и чем отличается число от строки.  

  2. erkur говорит:

    Замени:
    while(!(_kbhit())){
    cin >> i;
    }
    на: cin >> i;  

  3. Роман Мусаков говорит:

    _kbhit(), как вы правильно отметили, проверяет наличие ввода с клавиатуры. В связке с _getch(), _getch() не ждет данных в буфере, потому что они там уже есть, и если он успеет их прочитать, «обычного» ожидания ввода не будет. Вообще, как бы _getch() — это такая вещь, которая работает череж жопу, но работает. 🙂

    Чем же _getch() отличается от cin? Во-первых, _getch() игнорирует режим терминала (консоли), который по умолчанию «канонический» или «буферизирующий» (режим с буферизацией). Этот режим означает, что терминал будет удерживать введенные символы до тех пор пока не будет введен особый символ, обычно это символ перевода строки (0x0a, клавиша enter) или ждать до тех пор, пока не переполнится буфер терминала. _getch() читает прямо из буфера клавиатуры (где-то около 0x4xx, какой-то адрес в памяти в виндах, не помню). Если включить неканонический режим, терминал будет мимо буфера совать в стандартный ввод, всё что увидит и cin будет работать как _getch(). И тут мы подошли ко второму отличию — cin читает неограниченными пачками, в то время как _getch() ждет только 1 символ, читает его и закрывается. Например, юзер зажмет клавишу. В этом случае _getch() схавает один символ и успокоится (если он не зациклен), а cin может успеть подхватить, например, 2, 3, 5 или 50 символов, всё упирается в железо и лаг системы. Ну и наконец 3е отличие: _getch() кушает только 1 байт данных, тупо байт, тупо какую-то цифру от 0 до 255 (или от -128 до 127), в то время как cin предназначен для форматированного ввода. Разумеется, там есть защита от дурака, но насколько она надежна, я не проверял. Т.е. если мы попробуем, например, ввести в int-переменную строку, то получим в ней 0.

    Собственно, что происходит во второй программе после конструкции while(!(_kbhit())). Клавиша не нажата, _kbhit() возвращает ноль, логическое отрицание нуля дает нам true — входим в тело цикла. Там у нас работает cin в каноническом режиме. Ждет пока эмулятор терминала выдаст введенную последовательность после детектирования в буфере клавиатуры кода клавиши enter. После того, как вы ввели, например, 123, вы жмете enter и если _kbhit() успевает поймать его (enter) в буфере клавиатуры, то цикл завершается, выводится 123. В противном случае, бесконечный цикл.

    Более того, _getch() работает только в виндах, является архаичным поделием борланда, мигрировавшим в мелкомягкий C++, следовательно, исходя из этих двух фактов, о _getch(), как таковом, лучше забыть.

Комментарии запрещены.