Иллюстрированный самоучитель по задачам и примерам Assembler

Организация высокоуровневого консольного ввода-вывода

Для высокоуровневого ввода-вывода приложение может использовать файловые функции 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 и т. д.;
  • автоматическая обработка некоторых символов, выводимых на экран: перевода строки и каретки, возврата на один символ и т. д.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.