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
| |