ИМЯ
fopen, fdopen, freopen - функции для открытия потоковLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict mode); FILE *fdopen(int fd, const char *mode); FILE *freopen(const char *restrict pathname, const char *restrict mode, FILE *restrict stream);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
fdopen():
_POSIX_C_SOURCE
ОПИСАНИЕ
Функция fopen() открывает файл с именем, которое задано в виде строки в pathname, и связывает его с потоком. Параметр mode указывает на строку, начинающуюся с одной из следующих последовательностей (за ними могут следовать дополнительные символы, описанные далее):- r
- Открыть текстовый файл для чтения. Поток совмещается с началом файла.
- r+
- Открыть для чтения и записи. Поток совмещается с началом файла.
- w
- Обрезать файл до нулевой длины или создать текстовый файл для записи. Поток совмещается с началом файла.
- w+
- Открыть для чтения и записи. Файл создаётся, если его не существует, в противном случае он обрезается. Поток совмещается с началом файла.
- a
- Открыть для добавления (записи в конец файла). Файл создаётся, если его не существует. Поток совмещается с концом файла.
- a+
- Открыть для чтения и добавления (записи в конец файла). Файл создаётся, если не существует. Вывод всегда добавляется в конец файла. В POSIX ничего не упоминается о начальном положении при чтении, когда используется данный режим. В glibc начальное положение в файле для чтения устанавливается в начало файла, но в Android/BSD/MacOS начальное положение в файле для чтения устанавливается в конец файла.
fseek(stream, 0, SEEK_END);
Файловый дескриптор, связанный с потоком, открывается как при вызове open(2) со следующими флагами:
режим fopen() | флаги open() |
r | O_RDONLY |
w | O_WRONLY | O_CREAT | O_TRUNC |
a | O_WRONLY | O_CREAT | O_APPEND |
r+ | O_RDWR |
w+ | O_RDWR | O_CREAT | O_TRUNC |
a+ | O_RDWR | O_CREAT | O_APPEND |
fdopen()
Функция fdopen() связывает поток с существующим дескриптором файла fd. Режим mode потока (одно из следующих значений: «r», «r+», «w», ,w+», «a», «a+») должен быть совместим с режимом дескриптора файла. Указатель положения в файле в новом потоке принимает значение, равное значению у fd, а указатели ошибок и конца файла очищаются. Режимы «w» или «w+» не обрезают файл. При этом не делается копия дескриптора файла и он будет закрыт одновременно с закрытием потока, созданного fdopen(). Результат применения fdopen() к общему объекту памяти не определён.freopen()
Функция freopen() открывает файл с именем pathname и связывает его с потоком, указанным в stream. Исходный поток (если такой существовал) закрывается. Значение параметра mode такое же как для функции fopen(). Если значение pathname равно указателю null, то freopen() изменяет режим потока на указанный в mode; то есть, freopen() переоткрывает pathname, связанный с потоком. Описание этого поведения было добавлено в стандарт C99, где сказано:В этом
случае
файловый
дескриптор,
связанный
с потоком,
не нужно
закрывать,
если вызов
freopen()
завершился
без ошибок.
Допустимость
изменения
режима и
при каких
условиях
определяется
реализацией.
Основной
задачей
функции freopen()
является
смена
файла,
связанного
со
стандартным
текстовым
потоком ( stderr,
stdin или stdout).
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Upon successful completion fopen(), fdopen(), and freopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to indicate the error.ОШИБКИ
- EINVAL
- Передано неверное значение mode в fopen(), fdopen() или freopen().
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).Интерфейс | Атрибут | Значение |
fopen(), fdopen(), freopen() | Безвредность в нитях | MT-Safe |
СТАНДАРТЫ
fopen(), freopen(): POSIX.1-2001, POSIX.1-2008, C99. fdopen(): POSIX.1-2001, POSIX.1-2008.ЗАМЕЧАНИЯ
Замечания по glibc
Библиотека GNU C предоставляет следующие расширения строки в mode:- c (начиная с glibc 2.3.3)
- Do not make the open operation, or subsequent read and write operations, thread cancelation points. This flag is ignored for fdopen().
- e (начиная с glibc 2.7)
- Открыть файл с флагом O_CLOEXEC. Подробности смотрите в open(2). Этот флаг игнорируется для fdopen().
- m (начиная с glibc 2.3)
- Пытаться получить доступ к файлу с помощью mmap(2), а не с помощью системных операций ввода-вывода ( read(2), write(2)). В настоящее время mmap(2) используется только для файла, открытого на чтение.
- x
- Открыть файл в монопольном режиме (как с флагом O_EXCL у open(2)). Если файл уже существует, то fopen() завершается с ошибкой и устанавливает значение errno равное EEXIST. Этот флаг игнорируется для fdopen().
ДЕФЕКТЫ
When parsing for individual flag characters in mode (i.e., the characters preceding the "ccs" specification), the glibc implementation of fopen() and freopen() limits the number of characters examined in mode to 7 (or, before glibc 2.14, to 6, which was not enough to include possible specifications such as "rb+cmxe"). The current implementation of fdopen() parses at most 5 characters in mode.СМ. ТАКЖЕ
open(2), fclose(3), fileno(3), fmemopen(3), fopencookie(3), open_memstream(3)ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |