Поблочный и побайтовый режимы управления файлами.
Средства ввода и вывода не являются частью языка непосредственно, вот почему мы не рассматривали их в нашем представлении до настоящего времени. Тем не менее, программы взаимодействуют с их окружающей средой намного более сложными путями чем те, мы показали прежде. В этой главе мы опишем стандартную библиотеку, набор функций, которые обеспечивают ввод и вывод.
Традиционно C использует услуги UNIX, чтобы работать со вводом/выводом, то есть C язык имеет три способа системных вызовов:
Стандартный ввод/вывод;
Байт-ориентированный ввод/вывод;
Блок-ориентированный ввод/вывод.
В этой главе мы описываем эти три способа. Но стандартный ввод/вывод мы видели выше. Свойства функций библиотеки определены в заголовочных файлах <stdio.h>, <io.h>, <ctype.h>.
5.I. Байт-ориентированный ввод/вывод.
На C языке как в UNIX, файл - это цепочка байтов.
Функции для работы с цепочкой байтов находятся в заголовочном файле <stdio.h>. Работа с основной функцией этого заголовочного файла мы обсудим ниже.
5.I.1. Доступ к Файлу.
Стандартный ввод и вывод автоматически определен для программы локальной операционной системой.
Следующий шаг описывает программу, где доступ к файлу не связан с программой. Одна программа, которая иллюстрирует потребность в таких действиях - CAT, где набор файлов на стандартном выводе используется для печати файлов на экране. Например, команда
cat x.c, y.c
печатает содержание файлов x.c и y.c (и ничто иное) на стандартном выводе (на экране).
Вопрос - как принять меры, чтобы названные файлы читались - то есть как соединить внешние имена файлов со статусом, в котором должны обрабатываться данные.
Правила просты. Прежде, чем читать или писать, файл должен быть открыт функцией библиотеки fopen. Fopen берет внешнее название(имя) подобно x.c или y.c, делает хранилище характеристик файла через запрос операционной системой (детали которого не должны коснуться нас), и возвращают указатель, который нужно использовать в последующем чтении или письме файла.
Этот указатель, называемый УКАЗАТЕЛЕМ ФАЙЛА, указывает на структуру, которая содержит информацию относительно файла, типа местоположения буфера, текущее положение знака в буфере, чтения или записи в файл, признаков ошибки или конца файла. Пользователи не должны знать детали, потому что определения, полученные от <stdio.h> включают декларацию структуры по имени ФАЙЛ. Единственная декларация, необходимая для указателя файла
FILE *fp;
FILE *open(char *name, char *mode);
Это говорит, что fp - указатель на ФАЙЛ, и fopen возвращает указатель на ФАЙЛ. Заметьте, что FILE - название типа, подобно int, не признак структуры; это определено с TYPEDEF.
Запрос к fopen в программе
Fp = fopen (name, mode);
Первый аргумент fopen - строка знаков, содержащая название(имя) файла. Второй аргумент - способ, также строка знаков, которая указывает, как пользователь намеревается использовать файл. Допустимые способы включают читаемый ("r"), пишут ("w"), и добавляют в конец ("a"). Некоторые системы различают текстовые и двоичные файлы; для двоичного "b" должен быть добавлен в конец к строке mode, а для файлов текста, следует добавить "t".
Если файл, который не существует, открыт для письма или добавления в конец, он создается, если возможно. Открытие существующего файла для записи вызывает разрушение старого содержания, в то время как открытие для добавления в конец сохраняет их. Попытка читать файл, который не существует - ошибка, могут быть и другие причины ошибки подобно попытке читать файл, когда Вы не имеете разрешения. Если имеется любая ошибка, fopen возвратит ПУСТОЙ УКАЗАТЕЛЬ.
Следующие функции - способ читать или писать в открытый файл. Имеются несколько возможностей, из которых GETC и PUTC являются самыми простыми. Getc возвращает следующий знак из файла; требуется указатель файла, чтобы сообщить это который файл.
int getc (fp);
Getc возвращает следующий знак из потока, описанного fp; функция возвращает EOF в случае конца файла или ошибки.
putc - функция вывода:
int putc (int c, fp);
putc пишет знак в файл fp и возвращает записанный знак, или EOF, если ошибка происходит. Подобно getchar и putchar, getc и putc может быть macros вместо функций.
Когда C программа начата, операционная окружающая среда системы ответственна за открытие трех файлов и обеспечения указателей файла для них. Эти файлы - стандартный вход, стандартный вывод, и стандартная ошибка; соответствующие указатели файла называются STDIN, STDOUT, и STDERR, и объявлены в <stdio.h>. Обычно STDIN связан с клавиатурой, а STDOUT, и STDERR связаны с экраном, но stdin и stdout могут быть переадресованы к файлам или трубопрводам.
Getchar и putchar может быть определен в терминах getc, putc, stdin, и stdout следующим образом:
#define getchar() getc(stdin)
#define putchar(c) putc(int c, stdout)
Для форматированного ввода или вывода файлов, служат функции FSCANF и FPRINTF. Они идентичны scanf и printf, за исключением того, что первый аргумент - указатель файла, который определяет файл, в который нужно читать или писать; строка формата - второй аргумент.
int fscanf (fp, char *format, ...);
int fprintf (fp, char *format, ...);
С этими мы можем написать программу CAT, чтобы связать файлы. Проект - тот, который был найден удобным для многих программ. Если имеются аргументы командной строки, они интерпретируются как имена файлов, и обработаны соответствующим образом. Если не имеется никаких аргументов, стандартный вход обработывается.
#include <stdio.h>
/* CAT: concatenate files, version 1 */
main (int argc, char *argv[])
{ FILE *fp;
void filecopy(FILE *, FILE *);
if (argc == 1) /* no args; copy standard input */
filecopy(STDIN, STDOUT);
else
while (--argc > 0)
if ((fp = fopen(*++argv, "r")) == NULL) {
printf ("cat: can't open %a\n", *argv);
return 1;
} else {
filecopy(fp, STDOUT);
fclose(fp);
}
return 0;
}
/* filecopy: copy file ifp to file ofp */
void filecopy(FlLE *ifp, FILE *ofp)
{ int c;
while ((c = getc(ifp)) != EOF)
putc(c, ofp);
}
Указатели файла stdin и stdout - объекты(цели) типа FILE *. Они - constants, и таким образом никакие другие присвения к ним не возможны.
Функция
int fclose (fp);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.