- •1. Основные отличия стандартной библиотеки Си от других
- •2. Определение класса символов и преобразование символов
- •3. Работа с областями памяти и строками
- •4. Функции преобразования типов
- •5. Математические функции
- •6. Динамическое распределение памяти
- •7. Функции стандартного ввода и вывода
- •8 . Функции ввода/вывода высокого уровня
- •9. Функции ввода/вывода нижнего уровня
- •10. Функции ввода/вывода с консольного терминала
- •11. Работа с каталогами файловой системы
- •12. Операции над файлами
- •13. Использование вызовов операционной системы
- •14. Управление процессами
- •15. Поиск и сортировка
- •16. Функции для работы с датой и временем
9. Функции ввода/вывода нижнего уровня
Функции нижнего уровня не требуют включения файла stdio.h. Тем не менее, несколько общих констант, определенных в этом файле, могут оказаться полезными (например, признак конца файла EOF). Прототипы функций нижнего уровня содержатся в файле io.h.
В настоящее время низкоуровневый доступ к файлам имеет ограниченное применение, такое как написание системных функций и драйверов для устройств, программируемых на Си.
В табл. 12 кратко перечислены функции для низкоуровневого доступа к файлам.
Таблица 12. Низкоуровневый доступ к файлам
________________________________________________________________________________
Функция Краткое описание
________________________________________________________________________________
close закрыть файл
creat создать файл
dup создать второй дескриптор (handle) для файла
dup2 переназначить дескриптор (handle) для файла
eof проверка на конец файла
lseek позиционирование указателя файла в заданное место
open открыть файл
read читать данные из файла
sopen открыть файл в режиме разделения доступа
tell получить текущую позицию указателя файла
write записать данные в файл
10. Функции ввода/вывода с консольного терминала
Функции ввода/вывода для консоли используют специфические особенности IBM‑совместимого компьютера, такие как наличие специального видеоадаптера, и не являются переносимыми на другие типы компьютеров. Прототипы функций содержатся в файле conio.h. Консольные функции позволяют читать и записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и отдельные символы. Функция kbhit определяет, было ли нажатие клавиши и позволяет определить наличие символов для ввода с клавиатуры до попытки чтения.
Во‑первых, существуют функции для работы с окном консоли, аналогичные библиотеке Crt Паскаля. В табл. 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 описаны прототипы ряда специфичных для Си функций (см. табл. 14).
Таблица 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); возврат последнего прочитанного символа с консольного
символа обратно с тем, чтобы он стал следующим символом для чтения.
Ограничения те же, что для ungetc.
________________________________________________________________________________
Приведенный ниже пример демонстрирует чтение строки с помощью функции 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);
}