fopen(), fopen64()

Открыть файловый поток

Прототип:

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

Аргументы:

filename
Имя файла, который необходимо открыть.
mode
Режим доступа.

Библиотека:

libc

Описание:

Функции fopen() и fopen64() открывают фаловый поток для файла, определяемого filename. Строка mode начинается одной из следующих последовательностей:

a
Добавление: создать новый файл или открыть файл для записи в конец.
a+
Добавление: открыть файл или создать его для обновления, записи в конец файла; использовать представление файла по умолчанию.
r
Открыть файл для чтения.
r+
Открыть файл для обновления (чтения и/или записи); использовать представление файла по умолчанию.
w
Создать файл для записи или усечь его до нулевой длины.
w+
Создать файл для обновления или усеяь его до нулевой длины; использовать представление файла по умолчанию.

Можно добавить символ b в конец любой из вышеуказанных последовательностей для указания того, что файл является (или должен быть) двоичным файлом (это требование ANSI для переносимости в системах, которые различают текстовые и двричные файлы, например DOS). Для ЗОСРВ «Нейтрино» нет различий между текстовыми и двоичными файлами.


Note: При использовании потока в режиме обновления чтение не может следовать за записью сразу же, без предварительного вызова fflush() или функций позиционирования ( fseek(), fsetpos() или rewind()). Аналогично, запись не может следовать за чтением без предварительного вызова функции позиционирования, если только чтение не привело к концу файла.

Наибольшее значение, которое может быть корректно представлено в объекте типа off_t, должно быть установлено как максимальное смещение в открытом файловом дескрипторе.

Возвращаемое значение:

Указатель на открытый поток. Если возникла ошибка или достигнут конец файла, функция возвращает NULL, код ошибки записывается в errno.

Коды ошибок:

EACCES
Для части префикса filename отсутствует право поиска, или файл существует и права, определенные mode, отсутствуют, или файл не существует и право на запись для родительской директории, в которой создается файл, отсутствует.
EBADFSYS
Файл или часть префикса filename были повреждены во время попытки открытия указанного файла. Системный сбой, автоматическое восстановление после которого невозможно, возник во время записи файла или обновления директории. Следует вызвать соответствующие системно-административные процедуры для исправления ситуации перед продолжением.
EBUSY
Доступ к файлу запрещен из-за конфликта открытия (смотрите sopen()).
EINTR
Операция fopen() прервана сигналом.
EINVAL
Значение аргумента mode некорректно.
EISDIR
Указанный файл является директорией, и аргумент режима определяет доступ только для записи или чтения/записи.
ELOOP
Слишком много уровней символических ссылок или префиксов.
EMFILE
Слишком много файловых дескрипторов открыто для данного процесса.
ENAMETOOLONG
Длина строки filename превышает PATH_MAX или часть пути к файлу длиннее, чем NAME_MAX.
ENFILE
Слишком много файлов открыто на текущий момент в системе.
ENOENT
Указанный файл или префикс filename не существуют, или аргумент filename указывает на пустую строку.
ENOMEM
Нет свободной памяти для структуры FILE.
ENOSPC
Директория или файловая система, в которой будет располагаться новый файл, не может быть расширена.
ENOSYS
Функция fopen() не реализована для файловой системы, в которой находится filename.
ENOTDIR
Часть префикса filename не является директорией.
ENXIO
Устройство, ассоциированное с файлом, было удалено (например, CD или гибкий диск).
EOVERFLOW
Указанный файл является обычным, и его размерне может быть корректно представлен в объекте типа off_t..
EROFS
Указанный файл расположен в файловой системе, доступной только для чтения.

Примеры:

#include <stdio.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "report.dat", "r" );
if ( fp != NULL )
{
/* rest of code goes here */
fclose( fp );
return (EXIT_SUCCESS);
}
return (EXIT_FAILURE);
}

Классификация:

fopen() — ANSI, POSIX 1003.1; fopen64() — Поддержка больших файлов

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

errno, fclose(), fcloseall(), fdopen(), freopen(), freopen64()




Предыдущий раздел: Описание API системной библиотеки