freopen、freopen_s
来自 cppreference.com
定义在头文件 <stdio.h> 中 |
||
(1) | ||
(直到 C99) | ||
(自 C99) | ||
(2) | (自 C11) | |
1) 首先,尝试关闭与
stream
关联的文件,忽略任何错误。然后,如果 filename
不是空指针,则尝试使用 mode
打开 filename
指定的文件,如同使用 fopen,并将该文件与 stream
指向的文件流相关联。如果 filename
是空指针,则函数尝试重新打开与 stream
关联的文件(在此情况下,允许的模式更改由实现定义)。2) 与 (1) 相同,只是
mode
的处理方式与 fopen_s 相同,并且文件流指针被写入 newstreamptr
,并且以下错误在运行时被检测到并调用当前安装的 约束处理程序 函数-
newstreamptr
是空指针 -
stream
是空指针 -
mode
是空指针
-
- 与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,
freopen_s
才保证可用。
内容 |
参数
filename | - | 要与文件流关联的文件名 |
mode | - | 空终止字符字符串,确定新的 文件访问模式 |
stream | - | 要修改的文件流 |
newstreamptr | - | 指向指针的指针,函数将结果存储在该指针中(输出参数) |
文件访问标志
文件访问 mode 字符串 |
含义 | 解释 | 如果文件 已存在 |
如果文件 不存在 |
---|---|---|---|---|
"r" | 读 | 打开文件以供读取 | 从开头读取 | 无法打开 |
"w" | 写 | 创建文件以供写入 | 销毁内容 | 创建新的 |
"a" | 追加 | 将数据追加到文件 | 写入末尾 | 创建新的 |
"r+" | 扩展读 | 打开文件以供读写 | 从开头读取 | 错误 |
"w+" | 扩展写 | 创建文件以供读写 | 销毁内容 | 创建新的 |
"a+" | 扩展追加 | 打开文件以供读写 | 写入末尾 | 创建新的 |
文件访问模式标志 "b" 可以选择性地指定以二进制模式打开文件。此标志对 POSIX 系统没有影响,但在 Windows 上它会禁用对 '\n' 和 '\x1A' 的特殊处理。 在追加文件访问模式下,无论文件位置指示器的当前位置如何,数据都会写入文件末尾。 | ||||
如果模式不是上面列出的字符串之一,则行为未定义。一些实现定义了其他支持的模式(例如 Windows)。 | ||||
在更新模式 ('+') 中,可以执行输入和输出,但输出不能后跟输入,除非在之间调用 fflush、fseek、fsetpos 或 rewind,输入不能后跟输出,除非在之间调用 fseek、fsetpos 或 rewind,除非输入操作遇到文件结尾。在更新模式下,即使指定了文本模式,实现也可以使用二进制模式。 | ||||
文件访问模式标志 "x" 可以选择性地附加到 "w" 或 "w+" 说明符。此标志强制函数在文件存在时失败,而不是覆盖它。 (C11) | ||||
当使用 fopen_s 或 freopen_s 时,使用 "w" 或 "a" 创建的任何文件的访问权限会阻止其他用户访问它。文件访问模式标志 "u" 可以选择性地预先添加到任何以 "w" 或 "a" 开头的说明符,以启用默认的 fopen 权限。 (C11) |
返回值
1) 成功时返回
stream
的值副本,失败时返回空指针。2) 成功时返回 0(并将
stream
的值副本写入 *newstreamptr),错误时返回非零值(并将空指针写入 *newstreamptr,除非 newstreamptr
本身是空指针)。备注
freopen
是唯一可以更改流的窄/宽方向的方式,一旦通过 I/O 操作或 fwide 建立了流的窄/宽方向,就无法再更改它。
Microsoft CRT 版本的 freopen
在 filename
是空指针时不支持任何模式更改,并将其视为错误(参见 文档)。一个可能的解决方法是非标准函数 _setmode()
。
示例
以下代码将 stdout
重定向到一个文件。
运行此代码
#include <stdio.h> #include <stdlib.h> int main(void) { puts("stdout is printed to console"); if (freopen("redir.txt", "w", stdout) == NULL) { perror("freopen() failed"); return EXIT_FAILURE; } puts("stdout is redirected to a file"); // this is written to redir.txt fclose(stdout); return EXIT_SUCCESS; }
输出
stdout is printed to console
参考
- C17 标准 (ISO/IEC 9899:2018)
- 7.21.5.4 freopen 函数 (p: 224-225)
- K.3.5.2.2 freopen_s 函数 (p: 429-430)
- C11 标准 (ISO/IEC 9899:2011)
- 7.21.5.4 freopen 函数 (p: 307)
- K.3.5.2.2 freopen_s 函数 (p: 590)
- C99 标准 (ISO/IEC 9899:1999)
- 7.19.5.4 freopen 函数 (p: 272-273)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.9.5.4 freopen 函数
另见
(C11) |
打开文件 (函数) |
关闭文件 (函数) | |
C++ 文档 针对 freopen
|