std::freopen

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

首先,尝试关闭与 stream 关联的文件,忽略任何错误。然后,若 filename 非空,则尝试如同用 std::fopenmode 打开 filename 所指定的文件,然后将该文件与 stream 所指向的文件流关联。若 filename 为空指针,则函数参数重打开已与 stream 关联的文件(此情况下允许哪种模式改变是实现定义的)。

参数

filename - 要关联文件流的文件
mode - 确定新文件打开模式的空终止字符串
stream - 要修改的文件流

文件访问标记

文件访问模式字符串 含义 解释 若文件已存在的行动 若文件不存在的行动
"r" 为读取打开文件 从起始读取 打开失败
"w" 为写入创建文件 销毁内容 创建新文件
"a" 追加 追加到文件 写入到末尾 创建新文件
"r+" 扩展读 为读取/写入打开文件 从起始读取 错误
"w+" 扩展写 为读取/写入创建文件 销毁内容 创建新文件
"a+" 扩展追加 为读取/写入打开文件 写入到末尾 创建新文件
文件访问模式标志 "b" 能可选地指定以二进制模式打开文件。此标志在 POSIX 系统上无效果,但例如在 Windows 上,它禁用对 '\n''\x1A' 的特殊处理。
在追加文件访问模式上,写入数据到文件尾,忽略文件位置指示器的当前位置。
文件访问模式标志 "x" 能可选地追加到 "w""w+" 指定符。此标志强制函数在文件存在的情况下失败,而非重写文件。(C++17)
若模式不是以上字符串之一,则行为未定义。一些实现定义了额外的支持模式(例如 MSVC)。

返回值

成功时为 stream,失败时为空指针。

注解

std::freopen 是一旦由 I/O 操作或 std::fwide 建立取向后,改变流窄/宽取向的唯一方式。

std::freopen 的 Microsoft CRT 版本在 filename 为空指针时不支持任何模式更改并将它当作错误(见文档)。可行的替代方案是非标准函数 _setmode()

示例

下列代码重定向 stdout 到文件

#include <cstdio>
 
int main()
{
    std::printf("stdout 打印到控制台\n");
    if (std::freopen("redir.txt", "w", stdout))
    {
        std::printf("stdout 重定向到文件\n"); // 这被写入 redir.txt
        std::fclose(stdout);
    }
}

输出:

stdout 打印到控制台

参阅

打开文件
(函数)
关闭文件
(函数)