Namespaces
Variants

freopen, freopen_s

Из ru.cppreference.net
< c | io
 
 
Файловый ввод/вывод
Типы и объекты
        
Функции
Доступ к файлам
(C95)
Неформатированный ввод/вывод
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Форматированный ввод
Прямой ввод/вывод
Форматированный вывод
Позиционирование в файле
Обработка ошибок
Операции с файлами
 
Определено в заголовке <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

См. также

открывает файл
(функция)
закрывает файл
(функция)