命名空间
变体
操作

std::freopen

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

首先,尝试关闭与 stream 关联的文件,忽略任何错误。然后,如果 filename 不为 null,则尝试使用 mode 打开由 filename 指定的文件,就像通过 std::fopen 一样,并将该文件与由 stream 指向的文件流关联。如果 filename 是一个空指针,则函数尝试重新打开已与 stream 关联的文件(在这种情况下允许哪些模式更改是实现定义的)。

目录

[编辑] 参数

filename - 要将文件流关联到的文件名
mode - 确定新的文件访问模式的以 null 结尾的字符串
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 建立。

filename 为空指针时,Microsoft CRT 版本的 std::freopen 不支持任何模式更改,并将其视为错误(参见文档)。一种可能的解决方法是非标准函数 _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