|
Работа с каталогами файловой системы
Функции ввода/вывода с консольного терминала
Функции ввода/вывода для консоли используют специфические особенности 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); возврат последнего прочитанного символа с консольного символа обратно с тем, чтобы он стал следующим символом для чтения. Ограничения те же, что для 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);
}
Работа с каталогами файловой системы
Прототипы функций, описанных в табл. 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\n",
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,file,ext);
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.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 при ошибке
|
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|