Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
QWAN
58 / 57 / 1
Регистрация: 02.09.2008
Сообщений: 181
#1

Оъясните как работает консольный буфер ввода - C++

11.02.2010, 18:57. Просмотров 2187. Ответов 1
Метки нет (Все метки)

Windows поддерживает "очередь сообщений" для каждой программы, работающей в данный момент в системе Windows (значит и для консоли). Когда происходит ввод информации, Windows преобразует ее в "сообщение", которое помещается в очередь сообщений программы (я так понимаю в интересующий меня буфер консоли). Если я использую функцию ReadConsoleInput - читает данные из консольного буфера ввода и удаляет их из буфера, то вроде все ясно (она прочитала данные из буфера, записала их в массивструктур INPUT_RECORD и очистила буфер консоли) но к сожалению эта функция не возвращает значения до тех пор, пока, по крайней мере, не будет прочитана одна запись вводимых данных.
Если использовать
функцию PeekConsoleInput - читает данные из заданного консольного буфера ввода без удаления их из буфера. То возникает вопрос, нужно ли чистить буфер консоли и если чистить то как это организовать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2010, 18:57     Оъясните как работает консольный буфер ввода
Посмотрите здесь:

Полностью очистить буфер ввода - C++
Требуется, в конце программы, сделать небольшое ожидания для чтения того как отработала программа Написал: ...

Цикл ввода строкового массива работает не так, как нужно - C++
Объясните пожалуйста, почему цикл выполняется на один раз меньше числа, которое мы вводим с клавиатуры. То есть если я введу число 5, то...

Как работает метод get и putback (Подсчитать количество символов ввода вплоть до значения '$') - C++
Задание простое: подсчитать количество символов ввода вплоть до значения '$', и оставить '$' во входном потоке. Вот готовое решение: ...

Как написать обычный консольный Hello World? - C++
Как написать обычный консольный Hello World? Что то никак не получается

Как написать консольный прототип Скайпа - C++
Всем привет. Дочитал книжку по С++. Хочу закрепить знания. И написать простенький консольный прототип скайпа. ОС Windows XP SP2. В...

Как в MS Visual Studio создать простейший консольный Hello World? - C++
Здравствуйте, я новичок, хочу освоить программирование в C++, скачал для этого учебник Страуструпа "Язык программирования C++", изучаю....

Visual Studio 2015, как создать консольный проект? - C++
Только установила, когда хочу создать проект, ничего по плюсам там нет (в плане win32 или чет еще). Что делать? Я так понимаю, это где-то...

String как буфер - C++
можно ли использовать string как буфер? К примеру: void test(){ char buf; sprintf_s(buf, "HelloWorld!"); } работает...

Не работает одно исключение ввода - C++
Скажем так, это часть проги, должна проверять ввод значений, чтоб они были не нулевые, это условие работает, и чтоб элемент массива e1 был...

Не работает функция ввода массива - C++
У меня стоит задача вводить массива с клавиатуры размера M на N, с проверкой на диапазон. Вот мой код функции: void input (short mas ,int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
QWAN
58 / 57 / 1
Регистрация: 02.09.2008
Сообщений: 181
15.02.2010, 10:02  [ТС]     Оъясните как работает консольный буфер ввода #2
Тема закрыта.
Консольный буфер чистить нужно!
Низкоуровневые функции обеспечивают прямой доступ к буферу вводимых данных, в отличие от высокоуровневых функций, которые фильтруют и обрабатывают информацию буфера вводимых данных, сбрасывая все, кроме ввода информации с клавиатуры
.
Поэтому, если я использовал низкоуровневую функцию PeekConsoleInput , я должен после нее очистить буфер. В своем приложении я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Функция PeekConsoleInput читает данные из заданного консольного буфера ввода без удаления их из буфера
        if(!PeekConsoleInput(hStdin,    // дескриптор буфера ввода
                            pBuffer,    // буфер, в котором читаем
                            128,        // размер буфера чтения
                            &cNumRead))    // дескриптор буфера ввода
        {
            MessageBox(NULL, "ReadConsoleInput", "Console Error", MB_OK); 
            return 0;
        }//if(!PeekConsoleInput
        if(cNumRead)//Если PeekConsoleInput скопировал хоть что-то из буфера ввода то очищаем его
        {
            if(!FlushConsoleInputBuffer(hStdin)) //Очистка буфера
            {
                MessageBox(NULL, "FlushConsoleInputBuffer", "Console Error", MB_OK);
                return 0;
            }
        }//if(cNumRead)
Хотя, использовать функцию ReadConsoleInputв своем приложении я тоже мог. Для того чтобы программа не ожидала (зависала пока нет сообщения) можно было бы сначала проверить есть ли сообщения в буфере с помощью функции GetNumberOfConsoleInputEvents - выясняет число непрочитанных записей вводимых данных в буфере ввода. И если что то есть запустить ReadConsoleInput.
Yandex
Объявления
15.02.2010, 10:02     Оъясните как работает консольный буфер ввода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru