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/w/cpp/io/c/freopen