Автор работы: Пользователь скрыл имя, 26 Сентября 2012 в 18:23, лекция
Функции ввода/вывода с консольного терминала
Функции ввода/вывода для консоли используют специфические особенности IBM совместимого компьютера, такие как наличие специального видеоадаптера, и не являются переносимыми на другие типы компьютеров. Прототипы функций содержатся в файле conio.h. Консольные функции позволяют читать и записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и отдельные символы. Функция kbhit определяет, было ли нажатие клавиши и позволяет определить наличие символов для ввода с клавиатуры до попытки чтения.
Эти подпрограммы выводят текст
на экран.
clreol (conio.h)
gotoxy (conio.h)
clrscr (conio.h)
highvideo (conio.h)
delline (conio.h)
insline (conio.h)
gettext (conio.h)
lowvideo (conio.h)
gettextinvo(conio.h)
movetext (conio.h)
normvideo (conio.h)
textcolor (conio.h)
puttext (conio.h)
textmode (conio.h)
necursortype (conio.h)
wherex (conio.h)
textattr (conio.h)
wherey (conio.h)
textbackground(conio.h)
window (conio.h)
conio.h (от англ. console input-output — консольный ввод-вывод) — заголовочный файл, используемый в старых компиляторах, работающих в операционных системах MS-DOS, для создания текстового интерфейса пользователя. Тем не менее, он не является частью языка программирования Си, стандартной библиотеки языка Си, ISO C или требуемой стандартом POSIX.
Этот заголовочный файл объявляет несколько библиотечных функций для работы с «консольным вводом и выводом» программы. Большинство компиляторов языка Си, предназначенных для DOS, Windows 3.x, Phar Lap, DOSX, OS/2 или Win32 имели этот файл и обеспечивали сопутствующие библиотечные функции в библиотеке Си по умолчанию. Большинство компиляторов языка Си, предназначенных для UNIX и Linux, не имеют этого файла и не обеспечивают сопутствующих библиотечных функций.
int kbhit(void) |
Определяет, было ли нажатие клавиш клавиатуры |
int ungetch(int c) |
Помещает символ c обратно в буфер клавиатуры. |
int getch(void) |
Считывает символ напрямую из консоли без использования буфера и echo-вывода. |
int getche(void) |
Считывает символ напрямую из консоли без использования буфера, но с использованием echo-вывода. |
int putch(int c) |
Функция _putch выводит символ c в консоль без буферизации. В случае успеха возвращает c. В противном случае возвращает EOF. |
char *_cgets(char *buffer) |
Считывает строку из консоли и хранит ее в массиве, указывающим на буфер. buffer[0], должен содержать максимальную длину (в символах) строки, то есть сколько символов нужно считать. Второй элемент массива buffer[1] указывает «где». _cgets хранит текущую длину строки. _cgets считывает символы до символа возврата, перевода строки или указанного максимума числа символов. |
int _cprintf(const char *format, arg0,... argn) |
Форматирование и вывод («печать») строки напрямую в консоль. |
int _cputs(const char *string) |
Вывод строки напрямую в консоль. |
int _cscanf(char *format, arg0,... argn) |
Считывание и форматирование данных напрямую из консоли. |
Функции ввода/вывода для консоли используют специфические особенности IBM-совместимого компьютера, такие как наличие специального видеоадаптера, и не являются переносимыми на другие типы компьютеров. Прототипы функций содержатся в файле conio.h. Консольные функции позволяют читать и записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и отдельные символы. Функция kbhit определяет, было ли нажатие клавиши и позволяет определить наличие символов для ввода с клавиатуры до попытки чтения.
Во-первых, существуют функции для работы с окном консоли, аналогичные библиотеке Crt Паскаля. В табл. 8.13 кратко перечислены основные из них.
Таблица 8.13. Функции для работы с окном консоли
Функция |
Краткое описание |
window |
void window(int left, int top, int right, int bottom); Устанавливает текущее окно консоли по указанным координатам |
clrscr |
void clrscr(void); очищает текущее окно |
clreol |
void clreol(void); очищает текущую строку окна от позиции курсора до конца |
delline |
void delline(void); удаляет строку окна, в которой установлен курсор |
insline |
void insline(void); вставляет пустую строку в позиции курсора |
gotoxy |
void gotoxy(int x, int y); перемещает курсор в указанные столбец (x) и строку (y) окна |
textbackground |
void textbackground(int newcolor); устанавливает указанный фоновый цвет окна. Цвета указываются номерами 0-15 или названиями, определенными в conio.h (BLUE, GREEN и т. д.) |
textcolor |
void textcolor(int newcolor); устанавливает указанный цвет вывода текста в окне. Цвета указываются аналогично функции textbackground |
wherex |
int wherex(void); возвращает номер столбца окна, в котором находится курсор |
wherey |
int wherey(void); возвращает номер строки окна, в которой находится курсор |
Во-вторых, в файле conio.h описаны прототипы ряда специфичных для Си функций (см. табл. 8.14).
Таблица 8.14. Функции ввода/вывода для консоли
Функция |
Краткое описание |
Cgets |
char *cgets(char *str); чтение строки с консоли до комбинации CR/LF или достижения максимально возможного числа символов. Если cgets читает комбинацию CR/LF, она заменяет ее на нулевой байт перед сохранением строки. Перед вызовом функции str[0] должен быть установлен в максимально возможное число символов для чтения. В случае успеха str[1] содержит реально прочитанное число символов, возвращается указатель на str[2]. При чтении комбинации CR/LF она заменяется нулевым байтом. Нулевой байт добавляется в конец строки. Таким образом, длина буфера должна быть не меньше str[0]+2 байт. |
cprintf |
int cprintf(const char *format[, argument, ...]); запись данных на консольный терминал по формату. Требования к строке формата и последующим аргументам аналогичны функции fprintf. Не переводит '\n' (символ LF) в пару символов '\r\n' (CR/LF). В случае успеха вернет число выведенных символов, в случае ошибки - EOF. |
Cputs |
int cputs(const char *str); вывод строки в текущее окно консольного терминала, определенное по умолчанию или функцией window. Не добавляет символов новой строки. |
Getch |
int getch(void); чтение символа
с консоли. Символ не |
getche |
int getche(void); чтение символа с консоли с эхо-печатью. Вернет код символа. |
Kbhit |
int kbhit(void); проверка нажатия клавиши на консоли. Пример: while (!kbhit()) /*до нажатия клавиши */ ; cprintf("\r\nНажата клавиша..."); |
Putch |
int putch(int c); Вывод символа на консольный терминал. Не переводит '\n' (символ LF) в пару символов '\r\n' (CR/LF). В случае успеха вернет символ, в случае ошибки - EOF |
ungetch |
int ungetch(int ch); возврат последнего
прочитанного символа с |
Приведенный ниже пример демонстрирует чтение строки с помощью функции cgets.
char buffer[83];
char *p;
/* Место для 80 символов + нулевого байта */
buffer[0] = 81;
printf("Введите строку:");
p = cgets(buffer);
printf("\ncgets прочитала %d \
символов:\"%s\"\n", buffer[1], p);
printf("Возвращен указатель %p, \
buffer[0] содержит %p\n", p, &buffer);
В следующем примере строка текста печатается в центре стандартного окна консоли.
#include <conio.h>
int main(void){
clrscr();
gotoxy(35, 12);
textcolor (RED);
cprintf("Hello world");
getch();
return 0;
}
Наконец, приведенный далее код
демонстрирует обработку
#include <stdio.h>
#include <conio.h>
int main(void) {
int ch;
do {
ch=getch();
if (ch=='\0') { //расширенный код
ch=getch();
switch (ch) {
case 72: printf ("\nUp"); break;
case 80: printf ("\nDown"); break;
case 75: printf ("\nLeft"); break;
case 77: printf ("\nRight"); break;
default: printf
("\nExtended key %2d",ch); break;
}
}
else {
switch (ch) {
case 13: printf ("\nEnter"); break;
case 27: printf ("\nEsc"); break;
default: printf ("\nKey %4d",ch);
break;
}
}
} while (ch!=27);
}
8.10. Работа с каталогами файловой системы
Прототипы функций, описанных в табл. 8.15, содержатся в стандартном заголовочном файле dir.h. Не все функции описаны в стандарте языка Си, но обычно все они предоставляются комилятором.
Таблица 8.15. Функции для работы с каталогами
Функция |
Краткое описание |
Chdir |
int chdir(const char *path); изменение текущего каталога, заданного полным или относительным путем path. Возвращает 0 в случае успеха, -1 в случае ошибки |
Getcwd |
char *getcwd(char *buf, int buflen); получить имя текущего рабочего каталога. В случае успеха buf!=NULL. Ограничения, такие как MAXPATH (макс. длина пути к каталогу) определены в <dir.h>. Аналог - int getcurdir (int drive, char *directory); Диск по умолчанию кодируется как 0, 1 обозначает диск A: и т. д. |
Mkdir |
int mkdir(const char *path); пытается создать новый каталог, заданный полным или относительным путем path. В случае успеха вернет 0, иначе -1 |
Rmdir |
int rmdir(const char *path); удаление каталога, заданного путем path. В случае успеха вернет 0, иначе -1 |
Findfirst |
int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); начинает поиск файла по шаблону имени pathname. для работы с поиском определен структурный тип ffblk: struct ffblk { long ff_reserved; long ff_fsize; //размер файла unsigned long ff_attrib;//атрибуты unsigned short ff_ftime; //время unsigned short ff_fdate; // дата char ff_name[256]; //найденное имя }; Атрибуты определены в библиотеке dos.h: FA_RDONLY Read-only FA_HIDDEN Hidden FA_SYSTEM System FA_LABEL Volume label FA_DIREC Directory FA_ARCH Archive Поле ff_ftime определяет время следующим образом: биты от 0 до 4 обозначают секунды, деленные на 2, биты 5-10 - минуты, биты 11-15 - часы. Поле ff_fdate определяет дату следующим образом: биты 0-4 обозначают день месяца, биты 5-8 - номер месяца, биты 9-15 - год с 1980 (например, 9 означает 1989). В случае успеха вернет 0, иначе -1 |
Findnext |
int findnext(struct ffblk *ffblk); продолжает поиск файла по ранее указанному для findfirst шаблону имени |
Fnmerge |
void fnmerge(char *path, const char *drive, const char *dir, const char *name, const char *ext); создает полное имя файла из отдельных компонент |
Fnsplit |
int fnsplit(const char *path, char *drive, char *dir, char *name, char *ext); разбивает полное имя файла на отдельные компоненты. Вернет целое число, биты которого показывают наличие отдельных компонент |
Getdisk |
int getdisk(void); возвращает номер текущего диска. 0 обозначает диск A:, 1 - B: и т. д. |
searchpath |
char *searchpath(const char *file); выполняет поиск файла в каталогах, перечисленных в системной переменной PATH. Если файл найден, вернет полный путь к нему в статическом буфере (обновляется при каждом вызове функции) |
setdisk |
int setdisk(int drive); задает текущее дисковое устройство. Диски обозначаются как для getdisk. Возвращает общее число дисков, доступных в системе |
Приведенный далее пример формирует листинг из всех файлов текущего каталога.
#include <stdio.h>
#include <dos.h>
#include <dir.h>
int main(void) {
struct ffblk ffblk;
int done;
printf("Directory listing of *.*\n");
done = findfirst("*.*",&ffblk,
FA_ARCH|FA_DIREC);
while (!done) {
unsigned t=ffblk.ff_ftime;
char s=(t&0x001F)<<1, m=(t&0x07E0)>>5,
h=(t&0xF800)>>11;
t=ffblk.ff_fdate;
char d=(t&0x001F), mon=(t&0x01E0)>>5;
int y=(t&0xFE00)>>9;
printf("%s %15ld \
%02d/%02d/%4d,%02d:%02d:%02d\
ffblk.ff_name,ffblk.ff_fsize,
d,mon,y+1980,h,m,s);
done = findnext(&ffblk);
}
getchar(); return 0;
}
В следующем примере иллюстрируется работа с функцией fnsplit.
#include <stdlib.h>
#include <stdio.h>
#include <dir.h>
char *s;
char drive[MAXDRIVE];
char dir[MAXDIR];
char file[MAXFILE];
char ext[MAXEXT];
int flags;
s=getenv("COMSPEC");
flags=fnsplit(s,drive,dir,
printf("Command processor info:\n");
if(flags & DRIVE)
printf("\tdrive: %s\n",drive);
if(flags & DIRECTORY)
printf("\tdirectory: %s\n",dir);
if(flags & FILENAME)
printf("\tfile: %s\n",file);
if(flags & EXTENSION)
printf("\textension: %s\n",ext);
8.11. Операции над файлами
В табл. 8.16 описаны основные стандартные функции, служащие для работы с файлами. В левом столбце таблицы под именем функции указаны имена библиотечных файлов, содержащих прототипы.
Таблица 8.16. Функции для работы с файлами
Функция |
Краткое описание |
access <io.h> |
int access(const char *filename, int amode); определение прав доступа к файлу. Допустимы значений amode=06 (проверка на чтение и запись), 04 (чтение), 02 (запись), 01 (выполнение), 00 (проверка на существование файла) |
chmod <io.h> |
int chmod(const char *path, int amode); изменение прав доступа к файлу. Допустимые значения amode определены в sys\stat.h: S_IWRITE (разрешение на запись), S_IREAD (на чтение), S_IREAD | S_IWRITE (то и другое). Вернет 0 в случае успеха, -1 при ошибке |
mktemp <dir.h> |
char *_mktemp(char *template); генерация
уникального имени файла. char *fname = "TXXXXXX", *ptr; ptr = mktemp(fname); |
remove <stdio.h> |
int remove(const char *filename); удаление файла. Вернет 0 в случае успеха, -1 при ошибке |
rename <stdio.h> |
int rename(const char *oldname, const char *newname); переименование файла из oldname в newname. Вернет 0 в случае успеха, -1 при ошибке |
Лабораторная работа №8. Программирование
в текстовом режиме
(Библиотека conio.h)
Функции ввода/вывода с консоли
Функции работы с текстами выполняются
в любом (из пяти возможных) текстовом
режиме; выбор режима зависит от типа видеоадаптера
и монитора. Текстовый режим определяется
вызовом textmode.
Вывод текста и манипуляция с ним
Запись и чтение текста:
cprintf посылает форматированный вывод на
экран
cputs посылает строку на экран
putch посылает один символ на экран
getche читает символ и отображает его на
экране
Манипулирование текстом (и курсором)
на экране:
clrscr очищает текстовое окно
clreol очищает строку с позиции курсора
delline удаляет строку, на которой находится
курсор
gotoxy устанавливает курсор
insline вставляет пустую строку под строкой,
содержащей курсор
movetext копирует текст с одного места экрана
на другое
Пересылка блоков текста в (из) память(и):
gettext копирует блок текста с экрана в память
puttext копирует блок текста из памяти на
экран.
Программы вывода текста на экран предусматривают
использование по умолчанию полноэкранных
окон, так что вы можете писать, читать
и манипулировать текстом без какой-либо
предварительной установки режима. Текст
пишется сразу на экран функциями консольного
вывода cprintf, cputs и putch, а для отображения
вводимого символа (эхо) используется
функция getche. Текст укладывается внутрь
окна следующим образом: если текст заходит
за правую границу окна, то соответствующий
отрезок текста переносится на начало
следующей строки.
Когда текст находится на экране, вы можете:
стереть его (т. е. очистить активное окно)
- clrscr, уничтожить часть строки - clreol, удалить
строку целиком - delline, вставить пустую
строку - insline. Последние три функции действуют
в соответствии с положением курсора;
вы можете передвигать курсор к определенному
месту при помощи функции gotoxy. Вы также
можете скопировать целый блок текста
из одного прямоугольного участка окна
в другой командой movetext.
Перенос прямоугольного блока текста
с экрана в память вызывается функцией
gettext, а обратная пересылка на экран (в
любое желаемое место) выполняется функцией
puttext.
Управление режимами и окнами
textmode установка экрана в текстовый режим
window задание окна в текстовом режиме
Экран может быть установлен в один из
нескольких текстовых режимов с помощью
textmode (ограничения связаны только с типами
адаптера и монитора вашей системы). Эта
функция устанавливает полноэкранное
текстовое окно в заданный режим и очищает
его.
Когда установлен текстовый режим, вы
можете работать с полным экраном или
с его частью - окном, которое ограничивает
программный вывод. Окно создается вызывом
функции window, определяющей, какую область
экрана займет окно.
Управление атрибутами
Установка цвета символов и цвета
фона:
textcolor устанавливает цвет текста (атрибут)
textbackground устанавливает цвет фона (атрибут)
textattr устанавливает цвет символа и цвет
фона (атрибуты) одновременно.
Изменение интенсивности:
highvideo устанавливает повышенную интенсивность
текста
lowvideo устанавливает пониженную интенсивность
текста
normvideo устанавливает нормальную интенсивность
текста
Функции управления атрибутами устанавливают
текущий атрибут, который задается 8-битным
значением: четыре младших бита управляют
цветом текста, следующие три определяют
цвет фона, а самый старший бит является
признаком мигания.
После установки дальнейший текст будет
выводиться в соответствии с текущими
атрибутами. С помощью функций управления
атрибутами вы можете устанавливать цвет
символа и цвет фона раздельно (textcolor и
textbackground) или одновременно вызовом textattr
с заданной комбинацией цветов. Также
может быть указан признак мигания символа.
Большинство цветных мониторов в цветовых
режимах правильно передают цвета. Нецветные
мониторы могут переводить цветное изображение
в нецветное или создавать различные визуальные
эффекты: жирный шрифт, подчеркивание,
инверсное отображение и т. д.
Вы можете поменять изображение высокой
интенсивности на низкую вызовом lowvideo
(выключает бит высокой интенсивности
для символов) или, наоборот, поменять
изображение низкой интенсивности на
высокую вызовом highvideo (включает бит высокой
интенсивности). Оперируя интенсивностью
символа, вы можете вернуться к исходному
уровню с помощью normvideo.
Запрос состояния
gettextinfo заполняет структуру text_info информацией
о текущем текстовом окне
wherex сообщает x координату ячейки с курсором
wherey сообщает y координату ячейки с курсором
Текстовые окна
По умолчанию текстовое окно занимает
весь экран. Вы можете изменить его, сократив
вызовом функции window. Текстовые окна могут
включать до 25 строк (максимальное количество
строк экрана для всех текстовых режимов)
и до 40 или 80 колонок (в зависимости от
установленного текстового режима).
Отсчет координат текстового окна Турбо
Си ведется от верхнего левого угла. Координаты
текстового окна в левом верхнем углу
- (1,1); координаты правого нижнего угла
(при 80-символьном полноэкранном текстовом
окне) - (80,25).
Тип text_modes
Вы можете перевести ваш монитор в один
из пяти текстовых режимов, вызвав функцию
textmode. Перечислимый тип text_modes, определенный
в CONIO.H, дает возможность использовать
символические имена для установки аргумента
mode в функции textmode, взамен "сухого"
номера режима. Конечно, если вы используете
символичес кие константы, то должны включить
#include conio.h в текст вашей программы.
Числовые и символьные значения, определенные
text_modes, следующие:
LASTMODE -1 Предыдущий текстовый режим
BW40 0 Черно-белый, 40 колонок
C40 1 16-цветный, 40 колонок
BW80 2 Черно-белый, 80 колонок
C80 3 16-цветный, 80 колонок
MONO 7 Монохромный, 80 колонок