Содержание | Глава 13

Функция fopen

#include <stdio.h>
FILE *fopen(const char *fname, const char *mode);

Функция fopen() открывает файл, имя которого задается параметром fname, и возвращает указатель на поток, связанный с этим файлом. Типы операций, которые разрешено выполнять с файлом, определяются параметром mode. Возможные значения параметра mode приведены в таблице 13.1. Строка символов, которая будет играть роль имени реального файла, должна определять его имя, допустимое в данной операционной системе. Эта строка может включать спецификацию пути, если среда поддерживает такую возможность.

В версии C99 к параметрам fname и mode применен квалификатор restrict.

Если функция fopen() успешно открыла заданный файл, она возвращает указатель FILE. Если файл открыть не удается, возвращается нулевой указатель.

Таблица 13.1. Допустимые значения параметра mode функции fopen()
РежимНазначение
"r"Открывает текстовый файл для чтения
"w"Создает текстовый файл для записи
"а"Дописывает в текстовый файл
"rb"Открывает двоичный файл для чтения
"wb"Создает двоичный файл для записи
"ab"Дописывает в двоичный файл
"r+"Открывает текстовый файл для чтения и записи
"w+"Создает текстовый файл для чтения и записи
"а+"Открывает текстовый файл для чтения и записи
"rb+" или "r+b"Открывает двоичный файл для чтения и записи
"wb+" или "w+b"Создает двоичный файл для чтения и записи
"ab+" или "а+b"Открывает двоичный файл для чтения и записи

Как видно из таблицы, файл можно открывать либо в текстовом, либо в двоичном режиме. В текстовом режиме выполняются преобразования некоторых символов. Например, символы новой строки преобразуются в комбинацию кодов возврата каретки (ASCII 13) и конца строки (ASCII 10). В двоичном режиме подобные преобразования не выполняются.

В следующем фрагменте программы иллюстрируется корректный способ открытия файла.

FILE *fp;

if ((fp = fopen("test", "w"))==NULL) {
  printf("He удается открыть файл.\n");
  exit(1);
}

Благодаря такому методу перед записью в файл выявляется любая ошибка, возникающая при его открытии, например, использование защищенного от записи или заполненного диска.

Если с помощью функции fopen() открывается файл для вывода (записи), то любой уже существующий файл с заданным именем удаляется, а вместо него создается новый. Если файл с таким именем не существует, он будет создан. Чтобы открыть файл для выполнения операций чтения, нужно, чтобы этот файл уже существовал. В противном случае функция возвратит значение ошибки. Чтобы добавить данные в конец файла, необходимо использовать режим "а". Если окажется, что указанный файл не существует, он будет создан.

Осуществляя доступ к файлу, который открыт для чтения и записи, не следует сразу за операцией ввода выполнять операцию вывода, не прибегнув прежде к промежуточному вызову одной из следующих функций: fflush(), fseek(), fsetpos() или rewind(). Нельзя также сразу за операцией вывода выполнять операцию ввода, не прибегнув прежде к промежуточному вызову одной из перечисленных выше функций. Исключением является момент достижения конца файла во время операции ввода, т.e. в конце файла вывод может непосредственно следовать за вводом.

Максимальное количество файлов, которые могут быть открыты одновременно, ограничивается значением FOPEN_MAX, определенным в заголовке <stdio.h>.

Пример

Следующий фрагмент открывает файл с названием TEST для чтения-записи в двоичном режиме.

FILE *fp;

if((fp=fopen("test", "rb+"))==NULL) {
  printf("He удается открыть файл.\n");
  exit(1);
}

Зависимые функции

fclose() fread() fwrite() putc() getc()
Содержание | Глава 13