1.15. Внешние файлы

Для работы с внешними файлами в языке C используются указатели на файл, которые имеют тип FILE* , они аналогичны по своему назначению переменным типа FILE, TEXT или FILE OF тип в языке PASCAL.

Для открытия файла служит функция

FILE* fopen(char * имя файла , char* режим доступа ) которая возвращает указатель на файл или нулевой адрес NULL при возникно­вении ошибки. Существуют следующие режимы доступа:

"r"       - текстовый файл для чтения;

"w"       - текстовый файл для записи;

"a"       - текстовый файл для записи в конец файла;

"r+"     - текстовый файл для чтения и записи;

"w+"     - новый текстовый файл для записи и чтения;

"a+"      - текстовый файл с любым режимом доступа. Модификатор b в конце режима доступа означает бинарный файл с соответст­вующим режимом доступа. Функция fopen выполняет те же действия, что пара процедур Assign и Reset/Rewrite/Append в языке PASCAL.

Закрытие файла осуществляется функцией

int fclose(FILE* указатель на файл ) которая возвращает 0 при успешном завершении или EOF (=-1) при ошибке.

Функция

int feof(FILE* файл )

возвращает ненулевое значение, если достигнут конец файла.

Посимвольный ввод-вывод в файл осуществляется функциями:

int fgetc(FILE* указатель на файл ) - возвращает введенный символ или

EOF;

int fputc(int символ , FILE* указатель на файл ) - возвращает записанный символ или EOF.

Форматный ввод-вывод в файл осуществляется функциями:

int fscanf(FILE* указатель на файл , char* формат , список ввода ) -возвращает количество введенных значений или EOF;

int fprintf(FILE* указатель на файл , char* формат [ , список вывода J ) -возвращает количество записанных символов или EOF.

Без всяких затруднений, так же, как в языке PASCAL, можно читать из тек­стового файла числа функцией fscanf.

Строковый ввод-вывод в файл осуществляется функциями:

char* fgets(char* строка , int n, FILE* указатель на файл ) - читает не бо­лее n-1 символов, прекращает чтение при достижении символа '\n', добавляет в строку символ '\0', возвращает введенную строку или NULL , если произошла ошибка или достигнут конец файла;

int fputs(char* строка , FILE* указатель на файл ) - записывает строку в файл, возвращает последний записанный символ или EOF в случае ошибки. Функция не записывает символ '\n'.

Указатели на стандартные файлы ввода и вывода stdin и stdout автоматиче­ски инициализируются в начале выполнения программы и могут быть использо­ваны без каких-либо дополнительных описаний. Задав в качестве указателя на файл stdin в функциях fgetc, fscanf, fgets, мы получим соответственно функции getchar, scanf и gets для ввода с клавиатуры; использовав stdout в fputc, fprintf и fputs, получим соответственно putchar, printf и puts для вывода на экран.

С любыми файлами, в том числе и с текстовыми, можно работать как с фай­лами прямого доступа, используя функции:

void rewind(FILE* файл ) - устанавливает текущую позицию на начало фай­ла, аналогична процедуре Reset в языке PASCAL;

long ftell(FILE* файл ) - возвращает текущую позицию в файле, аналогична функции FilePos в языке PASCAL;

int fseek(FILE* файл , long смещение , int начало ) - позиционирует файл, аргумент начало принимает одно из трех значений : SEEK_SET - от начала фай­ла, SEEK_CUR - от текущей позиции, SEEK_END - от конца файла (смещение можно задавать со знаком). Возвращает 0 при успешном завершении и ненулевое значение при ошибке. Аналогична процедуре Seek в языке PASCAL.

Ввод-вывод в бинарные файлы осуществляется функциями:

size_t fread(void* буфер , size_t r, size_t n, FILE* файл ) - читает не более n записей длиной r , помещая их в память начиная с адреса буфер, возвращает ко­личество считанных записей, аналогична процедуре BlockRead в языке PASCAL;

size_t fwrite(void* буфер , size_t r, size_t n, FILE* файл ) - записывает из памяти начиная с адреса буфер n записей длиной r в файл, возвращает количест­во записанных записей, аналогична процедуре BlockWrite в языке PASCAL.