Namespaces
Variants

freopen, freopen_s

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
(1)
FILE * freopen ( const char * filename, const char * mode,
FILE * stream ) ;
(до 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 не является нулевым указателем, предпринимается попытка открыть файл, указанный в 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

Смотрите также

открывает файл
(функция)
закрывает файл
(функция)
C++ documentation для freopen