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

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

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

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

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

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

Перевод потока из файлового ввода/вывода в консольный ввод/вывод - C++
Есть кусок программы: freopen ("G:\\input.txt", "r", stdin); freopen ("G:\\output.txt", "w", stdout); //Открываем файлы - один...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2010, 10:02
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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