freopen, freopen_s
来自cppreference.com
在标头 <stdio.h> 定义
|
||
(1) | ||
(C99 前) | ||
(C99 起) | ||
(2) | (C11 起) | |
1) 首先,试图关闭与
stream
关联的文件,忽略任何错误。然后,若 filename
非空,则试图用 mode
打开 filename
所指定的文件,如同用 fopen ,然后将该文件与 stream
所指向的文件流关联。若 filename
为空指针,则函数试图重打开已与 stream
关联的文件(此情况下是否允许模式改变是实现定义的)。2) 同 (1) ,除了以 fopen_s 中的方式处理
mode
,并将指向文件流的指针写入 newstreamptr
,还在运行时检测下列错误,并调用当前安装的约束处理函数:
-
newstreamptr
是空指针 -
stream
是空指针 -
mode
是空指针
-
- 同所有边界检查函数,
freopen_s
仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含<stdio.h>
前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。
参数
filename | - | 要关联到文件流的文件名 |
mode | - | 确定文件访问模式的空终止字符串
|
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
自身为空指针)。注解
freopen
是一旦由 I/O 操作或 fwide 建立面向后,改变文件流窄/宽面向的唯一方式。
freopen
的 Microsoft CRT 版本在 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"); // 写入 redir.txt fclose(stdout); return EXIT_SUCCESS; }
输出:
stdout is printed to console
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.21.5.4 The freopen function (第 224-225 页)
- K.3.5.2.2 The freopen_s function (第 429-430 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.21.5.4 The freopen function (第 307 页)
- K.3.5.2.2 The freopen_s function (第 590 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.19.5.4 The freopen function (第 272-273 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.9.5.4 The freopen function
参阅
(C11) |
打开文件 (函数) |
关闭文件 (函数) |