Файл – это именованная область памяти на каком-либо физическом носителе информации, в которой может храниться исходный текст программы, какое-либо из ее промежуточных представлений, программа в машинном коде, готовая к исполнению, или данные для ее работы. В файлах могут содержаться любые текстовые документы и числовые данные, закодированная табличная, графическая и любая другая информация. Часто файлы разделяют на текстовые и двоичные, причем содержание первых предназначено для прочтения пользователем, а содержание вторых написано в машинном коде (при помощи специальных программ).
Аналогичным образом (так же как это делается при работе со стандартными потоками ввода-вывода stdin и stdout) можно осуществлять работу с файлами на диске. Для этой цели в библиотеку языка Си включены следующие функции:
fgetc( ), getc( ) - ввод (чтение) одного символа из файла;
fputc( ), putc( ) - запись одного символа в файл;
fprintf( ) - форматированный вывод в файл;
fscanf( ) - форматированный ввод (чтение) из файла;
fgets( ) - ввод (чтение) строки из файла;
fputs( ) - запись строки в файл.
Различие между функциями fgetc( ), getc( ) и fputc( ), putc( ) здесь не рассматривается, и поэтому в примерах мы будем использовать только одну из них.
Двоичный (бинарный) режим обмена с файлами.Двоичный режим обмена организуется с помощью функций getc() и putc(), обращение к которым имеет следующий формат:
с = getc(fp);
putc(c, fp);
где fp - указатель на поток;
с - переменная типа intдля приема очередного символа из файла или для записи ее значения в файл. Прототипы функции:
int getc ( FILE*stream );
intputc (intc, FILE* stream );
В качестве примера использования функций getc( ) и putc( ) рассмотрим программы ввода данных в файл с клавиатуры и программу вывода их на экран дисплея из файла.
Программа ввода читает символы с клавиатуры и записывает их в файл. Пусть признаком завершения ввода служит поступивший от клавиатуры символ '#'. Имя файла запрашивается у пользователя. Если при вводе последовательности символов была нажата клавиша <Enter>, служащая разделителем строк при вводе с клавиатуры, то в файл записываются управляющие коды "Возврат каретки" (CR- значение 13) и "Перевод строки" (LF - значение 10). Код CR в дальнейшем при выводе вызывает перевод маркера (курсора) в начало строки экрана дисплея. Код LF служит для перевода маркера на новую строку дисплея. Значения этих кодов в тексте программы обозначены соответственно идентификаторами CR и LF, т.е. CR и LF - именованные константы. Запись управляющих кодов CR и LF в файл позволяет при последующем выводе файла на экран отделить строки друг от друга.
В приводимых ниже программах используются уже рассмотренные выше функции getchar( ), putchar( ) для посимвольного обмена со стандартными потоками stdin, stdout.
Следующая программа читает поток символов из ранее созданного файла и выводит его на экран дисплея:
Программу чтения символов из файла можно усовершенствовать, добавив возможность вывода информации на экран порциями (кадрами):
В этой программе после вывода очередного кадра из МАХ строк для перехода к следующему кадру необходимо нажать любую клавишу.
Используя двоичный обмен с файлами, можно сохранять на диске информацию, которую нельзя непосредственно вывести на экран дисплея (целые и вещественные числа во внутреннем представлении).
Необходимые примеры и разъяснения приводятся в главе 8 при описании программы обслуживания базы данных о сотрудниках предприятия. Функции save( ) и load( ) из этого примера (см. §8.2) позволяют сохранить во внешней памяти и загрузить из внешней памяти базу данных о сотрудниках предприятия.