freopen, freopen_s
来自 cppreference.cn
定义于头文件 <stdio.h> |
||
(1) | ||
(until C99) | ||
(since C99) | ||
(2) | (since 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' 的特殊处理。在追加文件访问模式下,数据被写入文件的末尾,而与文件位置指示器的当前位置无关。 | ||||
如果 mode 不是上面列出的字符串之一,则行为未定义。某些实现定义了其他支持的模式(例如 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 的文档 for freopen
|