std::freopen

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

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

参数

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

返回值

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

注解

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

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"); // 这被写入 redir.txt
        std::fclose(stdout);
    }
}

输出:

stdout is printed to console

参阅

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