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
См. также
| открывает файл (функция) |
|
| закрывает файл (функция) |
|
Документация по C для freopen |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/freopen