freopen, freopen_s
Из ru.cppreference.net
| Определено в заголовке <stdio.h>
|
||
FILE* freopen( const char* filename, const char* mode,
FILE* stream );
|
(1) | (до C99) |
FILE* freopen( const char* restrict filename, const char* restrict mode,
FILE* restrict stream );
|
(начиная с C99) | |
errno_t freopen_s( FILE* restrict* restrict newstreamptr,
const char* restrict filename, const char* restrict mode,
FILE* restrict stream );
|
(2) | (начиная с C11) |
1) Сначала пытается закрыть файл, связанный с
stream, игнорируя любые ошибки. Затем, если filename не равен null, пытается открыть файл, указанный параметром 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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.5.4 The freopen function (p: TBD)
- K.3.5.2.2 The freopen_s function (p: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.21.5.4 The freopen function (p: 224-225)
- K.3.5.2.2 The freopen_s function (p: 429-430)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.21.5.4 The freopen function (p: 307)
- K.3.5.2.2 The freopen_s function (p: 590)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.19.5.4 The freopen function (p: 272-273)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.9.5.4 The freopen function
См. также
(C11) |
открывает файл (функция) |
| закрывает файл (функция) | |
Документация C++ для freopen
| |