Открыть файловый поток
#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). Для ЗОСРВ «Нейтрино» нет различий между текстовыми и двоичными файлами.
- Открытие файла в режиме чтения (
r
для mode) завершается с ошибкой, если файл не существует или не может быть прочитан.
- Открытие файла в режиме добавления (
a
для mode) заставляет принудительно записывать все последующие данные в текущий конец файла вне зависимости от предыдущих вызовов функции fseek().
- Если файл открыт в режиме обновления (
+
для mode), для связанного потока допустимы и чтение, и запись.
| При использовании потока в режиме обновления чтение не может следовать за записью сразу же, без предварительного вызова 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 )
{
fclose( fp );
return (EXIT_SUCCESS);
}
return (EXIT_FAILURE);
}
fopen() — ANSI, POSIX 1003.1; fopen64() — Поддержка больших файлов
- Да
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
errno, fclose(), fcloseall(), fdopen(), freopen(), freopen64()
Предыдущий раздел: Описание API системной библиотеки