Функции консольного ввода-вывода. — КиберПедия 

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Функции консольного ввода-вывода.

2019-10-30 146
Функции консольного ввода-вывода. 0.00 из 5.00 0 оценок
Заказать работу

Включение в исходный текст заголовочного файла

# include < conio. h >

  позволяет использовать в программе библиотеку консольного ввода-вывода. Ее возможности аналогичны модулю Crt языка Паскаль. На самом деле в среде Си нет отдельных библиотек, для стандартного и консольного ввода-вывода. Это у меня такие некорректные формулировки. Если посмотреть подкаталог Lib среды Borland C, мы увидим там несколько библиотек с похожими названиями Cc.lib, Cl.lib, Cm.lib и т.п. Это версии системной библиотеки Си, предназначенные для работы с различными моделями памяти – compact, large и пр. В системной библиотеке реализованы и стандартный, и консольный обмен, и многие другие функции. Отдельной библиотекой Graphics.lib оформлены графические функции –использование надо явно задать в пункте меню среды Options/Linker/Libraries. Функции графической библиотеки имеют такие же названия, и параметры, как функции модуля Graph, но записываются строчными буквами.

То же относится и к функции консольного обмена, они соответствуют функциям модуля Crt:

window (int X 1, int Y 1, int X 2, int Y 2) задание текстового окна координатами левого верхнего и правого нижнего углов окна (первый символ первой строки имеет координаты 1,1);

textbackground (int ColorF) – задание цвета фона; 

textcolor (int ColorC) - задание цвета символов;

clrscr () очистка текстового окна (заполнение цветом фона);

gotoxy (int X, int Y) перемещение курсора в позицию X,Y.

Некоторые функции имеют другие названия, но работают также, как аналоги из Паскаля:

char getch () консольный ввод символа с клавиатуры (аналог функции ReadKey);

int kbhit () - проверка нажатия клавиши (аналог функции KeyPressed). Если клавиша не нажата, функция возвращает ноль, если нажата – ненулевое значение.

Но есть и серьезное отличие – для обмена с дисплеем вместо функций библиотеки стандартного ввода вывода (printf(), scanf(), puts(),gets() и других) надо использовать их аналоги сprintf(), сscanf(), сputs(),сgets() из библиотеки консольного ввода-вывода. Только они учитывают заданное на экране окно, и цвета символов и фона.

 Кроме того, функции консольного ввода не пользуются буфером стандартного входного потока. Как уже упоминалось, коды нажатых клавиш обычно не передаются сразу прикладной программе. Они отображаются операционной системой на экране и записываются в в специальную область оперативной памяти – буфер входного потока. Это позволяет отменить (уничтожить при помощи клавиш Delete или BackSpace) неправильно введенные символы. Только полностью сформировав строку текста пользователь нажимает клавишу Enter и символы из буфера начинают передаваться оператору данных из стандартного входного потока.

Такая организация ввода не всегда удобна:

во многих приложениях используется управление цветом текста, выводимые тексты ограничиваются определенной областью экрана;

иногда требуется организовать «слепой ввод» без эхо-отображения вводимых символов (например, при вводе пароля);

при управлении движением изображения по экрану, перемещении по пунктам меню и т. п. код клавиши должен поступать в программу сразу после ее нажатия (не дожидаясь нажатия Enter).

Для решения таких задач как раз и используются консольные функции.

 

Напомним, что в видеопамяти каждому символу отводится два байта (в младшем находится код символа, а в старшем цвет символа и цвет фона). Не следует думать, что функции стандартного вывода всегда выводят белые символы на черном фоне – они просто ничего не записывают в байт атрибутов. Поэтому, если задать цвет фона textbackground(); и текста textcolor();, а потом очистить окно функцией clrscr(), она изменит атрибуты и стандартный вывод будет использовать заданные цвета.

Функции стандартного и консольного вывода по-разному обрабатывают символ \n – перевод строки:

стандартный вывод, встретив \n, выводит символы с кодами 10, 13 и переводит курсор в начало следующей строки;

консольный вывод выведет только символ с кодом 10 и курсор перейдет на одно знакоместо вниз.

Видимо, с этим же связано то, что функция вывода строки puts(“… “) автоматически переводит курсор на следующую строку, а cputs(“…”) – нет.  

 Если на экране задано окно функцией window(), функция gotoxy(x,y); переводит курсор в заданную точку окна, и стандартные функции (например, printf("текст \n");) будут выводит текст начиная от новой позиции курсора. Но символ \r в операторах консольного вывода переведет курсор на левый край окна, а стандартный вывод переведет курсор на левый край следующей строки экрана. То есть, printf() никак не учитывает наличие окна. Это gotoxy(10,10), как консольная функция, правильно перемещает курсор в окне.

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

Следует также заметить, что функции стандартного ввода «не замечают» нажатия клавиши Esc и клавиш с расширенными кодами (функциональных клавиш F1- F12, клавиш со стрелками и пр.). Их коды операционная система получает, но не помещает в буфер входного потока.

Напомним, что переменная типа char позволяет закодировать до 255 различных символов. Этого оказалось недостаточно, на функциональные клавиши кодов не предусмотрели, поэтому за каждой такой клавишей закрепили двойной код. При нажатии функциональной клавиши в программу вместо одного кода символа поступает два – сначала код ноль, а потом ненулевой код. Например, при нажатии стрелки "вправо» поступает код 0, а потом код символа 'M', при нажатии стрелки «вниз» после нуля следует 'P'-и т.д.

Вы легко можете вывести на экран расширенные коды клавиш, используя функцию getch():

Do

{

unsigned char n = getch (); Программа ждет нажатия клавиши

if (n ==0) Получили ноль - значит нажата клавиша с расширенным кодом,

 читаем еще раз.

{ n = getch ();   

  printf (“\ n Код клавиши % x символ % c “, n, n);

}

while (n!=27);                   Напомним, что 27 – код клавиши Esc.

Рассмотренную ситуацию можно также пояснять и другими словами: считать, что за функциональными клавишами закреплены не восьмиразрядные а шестнадцатиразрядные коды. Просто шестнадцатиразрядный код передается программе побайтно – сначала старший байт, потом младший. Следует отметить, что в настоящее время фирмами IBM, Microsoft, Oracle и другими внедряется новый стандарт кодировки символов Unicode, в котором каждый символ кодируется двумя байтами, что позволяет кодировать 65535 различных символов. Всем нам скоро придется в этой части переучиваться и учитывать, в своих программах, что каждому символу строки выделяется два байта.


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.