Организация высокоуровневого консольного ввода-вывода
Для высокоуровневого ввода-вывода приложение может использовать файловые функции ReadFile и WriteFile, а также функции консольного ввода-вывода Read-Console и WriteConsole. Эти функции обеспечивают косвенный доступ к входному и экранным буферам пульта. Физически эти функции фильтруют записи входного буфера консоли так, чтобы возвратить ввод как поток символов, игнорируя все другие записи с расширенной информацией о мыши, клавиатуре и изменении размеров окна консоли. Отфильтрованный поток символов отображается в окне консоли начиная с текущей позиции курсора. Существуют два важных отличия в использовании пар функций ReadFile\WriteFile и ReadConsole\WriteConsole.
- Поддержка символов Unicode и ANSI. Консольные функции (ReadConsole\WriteConsole) поддерживают эти наборы, а файловые (ReadFile\WriteFile) – нет.
- Функции файлового ввода-вывода могут использоваться как для обращения к файлам, так и к именованным каналам, устройствам, присоединенным к последовательному интерфейсу. Консольные функции ввода-вывода можно использовать только с тремя дескрипторами стандартного ввода-вывода (см. ниже описание функций ReadConsole\WriteConsole).
Из вышесказанного следует, что функции высокоуровневого ввода-вывода обеспечивают простой способ обмена (чтения-записи) потоков символов с консолью.
Операция чтения высокого уровня реализуется функцией ReadConsole, которая получает входные символы из буфера ввода консоли и сохраняет их в указанном буфере.
B00L ReadConsoleCHANDLE hConsolelnput. LPVOID ipBuffer. DWORD nNumberOfCharsToRead. LPDWORD lpNumberOfCharsRead. LPVOID lpReserved);
Параметры этой функции означают следующее:
- hConsolelnput – дескриптор входного потока консоли;
- IpBuffer – указатель на строку, в которую будет записана вводимая строка символов;
- nNumberOfCharsToRead – размер буфера, указанного lpBuffer;
- ipNumberOfCharsRead – количество действительно введенных символов;
- lpReserved – этот параметр не используется, поэтому должен задаваться как NULL.
Операция записи высокого уровня реализуется функцией WriteConsole, которая извлекает символы из указанного буфера и записывает их в экранный буфер, начиная с текущей позиции курсора и продвигая ее по мере записи символов.
B00L WriteConsoleCHANDLE hConsoleOutput. CONST VOID *lpBuffer. DWORD nNumberOfCharsToWrite. LPDWORD ipNumberOfCharsWritten. LPVOID lpReserved);
Параметры этой функции означают следующее:
- hConsoleOutput – дескриптор выходного потока консоли;
- lpBuffer – указатель на выводимую строку;
- nNumberOfCharsToWrite – размер буфера, указанного IpBuffer;
- IpNumberOfCharsWritten – количество действительно выведенных символов;
- lpReserved – этот параметр не используется, поэтому должен задаваться как NULL.
Для своей работы эти и некоторые другие консольные функции требуют получения стандартных дескрипторов ввода-вывода. Значения этих дескрипторов присваиваются параметрам hConsolelnput и hConsoleOutput. По умолчанию стандартный дескриптор ввода связан с клавиатурой, стандартный дескриптор вывода – с экраном. Получить стандартный дескриптор ввода-вывода можно с помощью функции GetStdHandle.
HANDLE GetStdHand 1 e(DWORD nStdHandle):
На вход функции GetStdHandle должно быть подано одно из следующих значений:
- STD_INPUT_HANDLE = -10 – дескриптор стандартного входного потока;
- STD_OUTPUT_HANDLE = -11 – дескриптор стандартного выходного потока;
- STD_ERROR_HANDLE = -12 – дескриптор стандартного потока ошибок.
Используя функции высокоуровневого ввода-вывода, приложение может управлять цветом текста и фона, с которыми должны отображаться символы, записываемые в экранный буфер. Приложение может изменять следующие свойства высокоуровневого консольного ввода-вывода:
- эхо-контроль вводимых символов на экране из активного экранного буфера;
- ввод строки, окончание операции чтения которой происходит при нажатии клавиши Enter;
- автоматическая обработка некоторых символов, вводимых с клавиатуры: перевода каретки, нажатия клавиш CTRL + C и т. д.;
- автоматическая обработка некоторых символов, выводимых на экран: перевода строки и каретки, возврата на один символ и т. д.