Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по лекциям.doc
Скачиваний:
25
Добавлен:
20.09.2019
Размер:
1.52 Mб
Скачать

5. Системные функции ввода для консольных устройств

5.1. Системные функции ввода текстовых строк

Как ни странно, ввод текстовых строк организуется для пользователей системных функций проще чем ввод отдельных символов. Поэтому с ввода текстовых строк и начнем.

В операционных системах MS Windows для ввода текстовых строк с клавиатуры в консольном режиме предназначена функция ReadConsole с прототипом

BOOL ReadConsole(HANDLE hConsInput, VOID* buffer,

DWORD len, DWORD *actlen, VOID* reserved).

Первый параметр этой функции задает хэндл буфера ввода для консоли. Он в простейших (и большинстве) случаях получается в результате вызова функции GetStdHandle с аргументом STD_INPUT_HANDLE. Параметр buffer задает буфер для ввода текстовой строки, а параметр len определяет максимальный размер вводимой строки (обычно этот параметр совпадает с длиной буфера buffer). Параметр actlen используется для получения числа – сколько символов было введено в результате выполнения функции. (В число символов входит и завершающий символ '\n'.) Последний параметр вызова функции зарезервирован разработчиками и должен браться равным NULL.

Заметим, что рассмотренная функция дает возможность ввода с консоли только в том случае, когда стандартный ввод не переназначен. Если же это условие нарушено, то данная функция возвращает значение FALSE, свидетельствующее об ошибке. При необходимости в Windows осуществлять ввод только с консоли, даже когда стандарный ввод переназначен, следует открыть для ввода файл, обозначаемый специальным именем CON (применив функцию CreateFile) и осуществлять ввод из этого файла.

В операционной системе Unix для ввода текста с консоли, если стандартный ввод не переназначается, можно использовать стандартные функции gets и scanf. Следует заметить, что использование функции gets настойчиво не рекомендуется профессионалами. Дело в том, что она может вернуть текст большей длины, чем предусмотрено программистом в ее вызове. Такая ситуация приводит к катастрофическим последствиям. Единственным эффективным решением указанной проблемы является отказ от применения данной функции. Вместо нее допустимо использовать более общую функцию стандартной библиотеки Си с прототипом

char* fgets(char *s, int size, FILE *stream),

где в качестве последнего параметра можно использовать символическую константу stdin, обозначающую поток стандартного ввода. (В этой функции явно указывается максимальный размер size текста, который может быть введен при ее вызове.) В то же время рассмотренная возможность не дает принципиального решения проблемы ввода с консоли, поскольку стандартный ввод может переназначаться в момент вызова программы в Unix.

В Unix для специализированного ввода именно с консоли следует использовать непосредственно устройство консоли как специальный файл. С этой целью нужно открыть доступ к виртуальной консоли, имеющей файловое имя /dev/tty. (В Unix обычно параллельно функционирует ряд виртуальных консолей, обозначаемых именами /dev/tty1, /dev/tty2, /dev/tty3 и т.д., но обозначение /dev/tty задает текущую управляющую консоль для исполняемой программы.) Заметим, что в Unix по историческим причинам принято называть консоль словом терминал, которое в общем случае обозначает нечто гораздо более общее, в частности, удаленное средство доступа к операционной системе. В данном изложении для единообразия в рассмотрении средств различных ОС будет использоваться термин консоль как приближенное наименование терминала в Unix.

Открытие доступа к терминалу Unix выполняется обычной функцией открытия, например, в виде

hcons=open("/dev/tty",O_RDONLY),

где переменная hcons должна быть предварительно описана как целочисленная. После такого открытия можно использовать функцию read(hcons, buffer, сколько) для чтения текста непосредственно с клавиатуры (даже если стандартный ввод переназначен).