freopen, freopen_s
来自 cppreference.cn
定义于头文件 <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 | - | 以 null 结尾的字符串,确定新的文件访问模式 |
stream | - | 要修改的文件流 |
newstreamptr | - | 指向一个指针的指针,函数将结果存储在此处(一个输出参数) |
文件访问标志
文件访问 模式字符串 |
含义 | 解释 | 文件 已存在时的操作 |
文件 不存在时的操作 |
---|---|---|---|---|
"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) 成功时返回零(并将
stream
值的副本写入 *newstreamptr),错误时返回非零(并将空指针写入 *newstreamptr,除非 newstreamptr
本身是空指针)。注意
一旦流的窄/宽方向通过 I/O 操作或 fwide 建立,freopen
是改变它的唯一方法。
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
|