C参考手册
文件输入/输出 | File input/output
freopen_s
在标题中定义<stdio.h> | |
---|---|
FILE * freopen( const char * filename, const char * mode, FILE * stream); |
(until C99) |
FILE *freopen( const char *restrict filename, const char *restrict mode, FILE *restrict stream ); |
(since C99) |
errno_t freopen_s(FILE *restrict *restrict newstreamptr, const char *restrict filename, const char *restrict mode, FILE *restrict stream); |
(since C11) |
1)首先,试图关闭与之相关的文件stream
,忽略任何错误。然后,如果filename
不为null,则尝试打开通过filename
使用mode
as 指定的文件fopen
,并将该文件与指向的文件流相关联stream
。如果filename
是空指针,那么函数将尝试重新打开已经关联的文件stream
(在此情况下,它是实现定义允许哪些模式更改)。
2)与(1)相同,不同之处在于mode
,处理方式如下,fopen_s
指向文件流的指针被写入,newstreamptr
并且在运行时检测到以下错误并调用当前安装的约束处理函数:
-
newstreamptr
是一个空指针 -
stream
是一个空指针 -
mode
是一个空指针
作为所有的边界检查函数,freopen_s
只能保证__STDC_LIB_EXT1__
是由实现定义的,并且如果用户在包含之前定义__STDC_WANT_LIB_EXT1__
为整数常量。 1<stdio.h>
参数
filename |
将文件流关联到的文件名 |
---|---|
mode |
以空字符结尾的字符串确定新的文件访问模式 |
文件访问模式字符串 |
含义 |
说明 |
行动如果文件已经存在 |
如果文件不存在,则 采取行动 |
---|---|---|---|---|
"r" |
读 |
打开一个文件以供阅读 |
从开始阅读 |
未能打开 |
"w" |
写 |
创建一个文件写入 |
破坏内容 |
创建新的 |
"a" |
附加 |
附加到文件 |
写入结束 |
创建新的 |
"r+" |
阅读扩展 |
打开文件进行读取/写入 |
从开始阅读 |
错误 |
"w+" |
写入扩展 |
创建一个用于读/写的文件 |
破坏内容 |
创建新的 |
"a+" |
追加扩展 |
打开文件进行读取/写入 |
写入结束 |
创建新的 |
"b"可以选择指定文件访问模式标志以二进制模式打开文件。这个标志对POSIX系统没有影响,但是在Windows上它禁止特殊处理' \ n '和' \ x1A '。在附加文件访问模式下,无论文件位置指示符的当前位置如何,数据都会写入文件末尾。 | ||||
如果模式不是上面列出的字符串之一,则行为是不确定的。一些实现定义了额外的支持模式(例如Windows)。 | ||||
在更新模式('+')中,可能会执行输入和输出,但是如果没有对fflush,fseek,fsetpos或rewind的干预调用,则输出不能跟随输入,并且输入不能在没有调用fseek,fsetpos或倒带,除非输入操作遇到文件结尾。在更新模式下,即使指定了文本模式,实现也可以使用二进制模式。 | ||||
文件访问模式标志"x"可以选择性地附加到“w”或“w +”说明符。如果文件存在,该标志强制该功能失败,而不是覆盖它。(C11) | ||||
对任何使用“w”或“a”创建的文件使用fopen_s或freopen_s,文件访问权限会阻止其他用户访问它。文件访问模式标志"u"可以有选择地添加到以“w”或“a”开头的任何说明符中,以启用默认fopen权限。(C11) |
stream |
- |
要修改的文件流 |
---|---|---|
newstreamptr |
- |
指向函数存储结果的指针(out参数) |
返回值
1)stream
成功的值的副本,失败时的空指针。
2)成功时为零(并且stream
写入的值的副本,*newstreamptr
错误时不为零(并且空指针被写入,*newstreamptr
除非newstreamptr
它本身是空指针)。
注意
freopen
是通过I / O操作或通过I / O操作建立后,改变流的窄/宽方向的唯一方法fwide
。
Example
以下代码重定向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);
}
输出:
stdout is printed to console
参考
- 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函数