freopen, freopen_s
From cppreference.net
|
Определено в заголовочном файле
<stdio.h>
|
||
| (1) | ||
| (до C99) | ||
| (начиная с C99) | ||
| (2) | (начиная с C11) | |
1)
Сначала предпринимается попытка закрыть файл, связанный с
stream
, игнорируя любые ошибки. Затем, если
filename
не является нулевым указателем, предпринимается попытка открыть файл, указанный в
filename
, используя
mode
, как если бы с помощью
fopen
, и связывает этот файл с файловым потоком, на который указывает
stream
. Если
filename
является нулевым указателем, то функция пытается переоткрыть файл, уже связанный с
stream
(реализационно определено, какие изменения режима разрешены в этом случае).
2)
Аналогично
(1)
, за исключением того, что
mode
обрабатывается как в
fopen_s
, указатель на файловый поток записывается в
newstreamptr
, и следующие ошибки обнаруживаются во время выполнения и вызывают установленную в данный момент
функцию обработки ограничений
:
-
-
newstreamptrявляется нулевым указателем -
streamявляется нулевым указателем -
modeявляется нулевым указателем
-
-
Как и все функции с проверкой границ,
freopen_sгарантированно доступна только если реализация определяет __STDC_LIB_EXT1__ и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h> .
Содержание |
Параметры
| filename | - | имя файла для ассоциации с файловым потоком |
| mode | - | строка символов с нулевым завершением, определяющая новый режим доступа к файлу |
| stream | - | файловый поток для модификации |
| newstreamptr | - | указатель на указатель, куда функция сохраняет результат (выходной параметр) |
Флаги доступа к файлу
|
Режим доступа к файлу
(строка) |
Значение | Объяснение |
Действие, если файл
уже существует |
Действие, если файл
не существует |
|---|---|---|---|---|
| "r" | чтение | Открыть файл для чтения | чтение с начала | ошибка открытия |
| "w" | запись | Создать файл для записи | уничтожить содержимое | создать новый |
| "a" | добавление | Добавление в файл | запись в конец | создать новый |
| "r+" | расширенное чтение | Открыть файл для чтения/записи | чтение с начала | ошибка |
| "w+" | расширенная запись | Создать файл для чтения/записи | уничтожить содержимое | создать новый |
| "a+" | расширенное добавление | Открыть файл для чтения/записи | запись в конец | создать новый |
|
Флаг режима доступа к файлу
"b"
может быть дополнительно указан для открытия файла в бинарном режиме. Этот флаг не влияет на POSIX-системы, но в Windows отключает специальную обработку
'
\n
'
и
'
\x1A
'
.
В режимах доступа с добавлением данные записываются в конец файла независимо от текущей позиции указателя файла. |
||||
| Поведение не определено, если режим не является одной из перечисленных выше строк. Некоторые реализации определяют дополнительные поддерживаемые режимы (например, Windows ). | ||||
| В режиме обновления ( '+' ) могут выполняться как ввод, так и вывод, но вывод не может следовать за вводом без промежуточного вызова fflush , fseek , fsetpos или rewind , а ввод не может следовать за выводом без промежуточного вызова fseek , fsetpos или rewind , если только операция ввода не достигла конца файла. В режиме обновления реализациям разрешено использовать бинарный режим даже когда указан текстовый режим. | ||||
| Флаг режима доступа к файлу "x" может быть дополнительно добавлен к спецификаторам "w" или "w+" . Этот флаг заставляет функцию завершиться ошибкой, если файл существует, вместо его перезаписи. (C11) | ||||
| При использовании fopen_s или freopen_s , права доступа к файлу для любого файла, созданного с "w" или "a" , запрещают другим пользователям доступ к нему. Флаг режима доступа к файлу "u" может быть дополнительно добавлен перед любым спецификатором, начинающимся с "w" или "a" , чтобы включить права доступа по умолчанию для fopen . (C11) | ||||
Возвращаемое значение
1)
Копия значения
stream
при успешном выполнении, нулевой указатель при неудаче.
2)
ноль при успехе (и копия значения
stream
записывается в
*
newstreamptr
), не ноль при ошибке (и нулевой указатель записывается в
*
newstreamptr
, если только
newstreamptr
сам не является нулевым указателем).
Примечания
freopen
— это единственный способ изменить узкую/широкую ориентацию потока после того, как она была установлена операцией ввода-вывода или функцией
fwide
.
Версия Microsoft CRT функции
freopen
не поддерживает изменение режима, когда
filename
является нулевым указателем, и рассматривает это как ошибку (см.
документацию
). Возможным обходным решением является нестандартная функция
_setmode()
.
Пример
Следующий код перенаправляет
stdout
в файл.
Запустить этот код
#include <stdio.h> #include <stdlib.h> int main(void) { puts("stdout is printed to console"); if (freopen("redir.txt", "w", stdout) == NULL) { perror("freopen() failed"); return EXIT_FAILURE; } puts("stdout is redirected to a file"); // this is written to redir.txt fclose(stdout); return EXIT_SUCCESS; }
Вывод:
stdout is printed to console
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.21.5.4 Функция freopen (стр. 224-225)
-
- K.3.5.2.2 Функция freopen_s (стр. 429-430)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.21.5.4 Функция freopen (стр. 307)
-
- K.3.5.2.2 Функция freopen_s (стр. 590)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.19.5.4 Функция freopen (стр: 272-273)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.5.4 Функция freopen
Смотрите также
|
(C11)
|
открывает файл
(функция) |
|
закрывает файл
(функция) |
|
|
C++ documentation
для
freopen
|
|