Namespaces
Variants

std:: freopen

From cppreference.net
< cpp ‎ | io ‎ | c
定义于头文件 <cstdio>
std:: FILE * freopen ( const char * filename, const char * mode, std:: FILE * stream ) ;

首先,尝试关闭与 stream 关联的文件,忽略任何错误。然后,如果 filename 非空,则尝试使用 mode std::fopen 的方式打开 filename 指定的文件,并将该文件与 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 是唯一能在流通过I/O操作或 std::fwide 建立窄/宽定向后改变其定向的方式。

Microsoft CRT 版本的 std::freopen 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