freopen, freopen_s
From cppreference.net
|
定义于头文件
<stdio.h>
|
||
| (1) | ||
| (C99前) | ||
| (C99起) | ||
| (2) | (C11起) | |
1)
首先,尝试关闭与
stream
关联的文件,忽略任何错误。随后,若
filename
非空指针,则尝试使用
mode
参数按
fopen
的方式打开
filename
指定的文件,并将该文件与
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 | - | 用于存储函数结果的指针的指针(输出参数) |
文件访问标志
|
文件访问
模式字符串 |
含义 | 说明 | 文件已存在时的操作 | 文件不存在时的操作 |
|---|---|---|---|---|
| "r" | read | 打开文件用于读取 | 从起始位置读取 | 打开失败 |
| "w" | write | 创建文件用于写入 | 销毁内容 | 创建新文件 |
| "a" | append | 追加到文件 | 写入到末尾 | 创建新文件 |
| "r+" | read extended | 打开文件用于读写 | 从起始位置读取 | 错误 |
| "w+" | write extended | 创建文件用于读写 | 销毁内容 | 创建新文件 |
| "a+" | append extended | 打开文件用于读写 | 写入到末尾 | 创建新文件 |
|
文件访问模式标志
"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
确定后改变其取向的方法。
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 函数 (页: 224-225)
-
- K.3.5.2.2 freopen_s 函数 (页: 429-430)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.21.5.4 freopen 函数 (页: 307)
-
- K.3.5.2.2 freopen_s 函数 (页: 590)
- C99标准(ISO/IEC 9899:1999):
-
- 7.19.5.4 freopen函数(页码:272-273)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.9.5.4 freopen 函数
参见
|
(C11)
|
打开文件
(函数) |
|
关闭文件
(函数) |
|
|
C++ 文档
关于
freopen
|
|