Справочник по C/C++
fopen()

include 
FILE *fopen(const char *fname, const char *mode);

Описание

Открывает файл и возвращает поток, связываемый с этим файлом

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

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

mode Назначение
"r" Открывает текстовый файл для чтения
"w" Создает текстовый файл для записи
"а" Открывает текстовый файл для записи в конец файла
"rb" Открывает двоичный файл для чтения
"wb" Создает двоичный файл для записи
"ab" Открывает двоичный файл для записи в конец файла
"r+" Открывает текстовый файл для чтения и записи
"w+" Создает текстовый файл для чтения и записи
"a+" Открывает текстовый файл для чтения и записи в конец файла
"rb+" или "r+b" Открывает двоичный файл для чтения и записи
"wb+" или "w+b" Создает двоичный файл для чтения и записи
"ab+" или "a+b" Открывает двоичный файл для чтения и записи в конец файла

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

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

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

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

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

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


Совет программисту

Любой файл можно открыть либо в текстовом, либо в двоичном режиме. Что в действительности содержит файл, не имеет при этом никакого значения. Например, файл, содержащий текст ASCII, все равно можно открыть и обрабатывать, как двоичный. Различное поведение файловой системы ANSI С при обработке двоичных и текстовых файлов проявляется лишь в том, что при открытии файла в двоичном режиме никаких преобразований символов не происходит.


При выполнении различных не текстовых операций с файлом действительно стоит открывать текстовый файл, как двоичный. Например, файловые утилиты, которые выполняют функции сравнения, сжатия или сортировки, обычно открывают файлы в режиме двоичного доступа. Кроме того, программы шифрования файлов практически всегда работают в двоичном режиме.

Главное различие между текстовым и двоичным файлом не в том, что файл содержит, а в том, каким способом он открыт.