Spec-Zone.ru › C++

std::freopen

Определено в заголовке <cstdio>
std::FILE* freopen( const char* filename, const char* mode, std::FILE* stream );

Сначала пытается закрыть файл, связанный с stream, игнорируя любые ошибки. Затем, если filename не является нулевым указателем, пытается открыть файл, указанный по filename, используя mode так, как если бы это делалось с помощью std::fopen, и связывает этот файл с потоком файла, на который указывает stream. Если filename — нулевой указатель, то функция пытается повторно открыть файл, уже связанный с stream (способы изменения режима в этом случае определяются реализацией).

Параметры

filename - имя файла для связывания с потоком файла
mode - строка символов с нулевым завершением, определяющая новый режим доступа к файлу
stream - поток файла, который необходимо изменить

Флаги доступа к файлам

Строка
режима доступа
к файлу
Значение Объяснение Действие, если файл
уже существует
Действие, если файл
не существует
"r" чтение Открыть файл для чтения чтение с начала вернуть NULL и установить ошибку
"w" запись Создать файл для записи уничтожить содержимое создать новый
"a" добавление Добавить к файлу запись в конец создать новый
"r+" расширенное чтение Открыть файл для чтения/записи чтение с начала вернуть NULL и установить ошибку
"w+" расширенная запись Создать файл для чтения/записи уничтожить содержимое создать новый
"a+" расширенное добавление Открыть файл для чтения/записи запись в конец создать новый
Флаг режима доступа к файлу "b" можно дополнительно указать, чтобы открыть файл в двоичном режиме. Этот флаг не имеет эффекта в системах POSIX, но в Windows, например, он отключает специальную обработку '\n' и '\x1A'.
В режимах добавления данные записываются в конец файла независимо от текущей позиции указателя положения файла.
Флаг режима доступа к файлу "x" можно дополнительно добавить к спецификаторам "w" или "w+". Этот флаг заставляет функцию возвращать ошибку, если файл существует, вместо перезаписи его содержимого. (C++17)
Поведение не определено, если режим не является одной из перечисленных выше строк. Некоторые реализации определяют дополнительные поддерживаемые режимы (например, Windows).

Возвращаемое значение

stream при успешном выполнении, нулевой указатель при ошибке.

Примечания

std::freopen — единственный способ изменить направление потока (узкий/широкий) после его установления операцией ввода-вывода или std::fwide.

Версия std::freopen от Microsoft CRT не поддерживает изменения режимов, когда filename — нулевой указатель, и рассматривает это как ошибку (см. документацию). Возможным решением является нестандартная функция _setmode().

Пример

Следующий код перенаправляет stdout в файл.

#include <cstdio>
 
int main()
{
    std::printf("stdout is printed to console\n");
    if (std::freopen("redir.txt", "w", stdout))
    {
        std::printf("stdout is redirected to a file\n"); // this is written to redir.txt
        std::fclose(stdout);
    }
}

Вывод:

stdout is printed to console

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/c/freopen

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API