freopen_s
freopen, freopen_s
在标题中定义 | |
---|---|
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
是一个空指针
作为所有的边界检查函数,freopen_s只能保证__STDC_LIB_EXT1__是由实现定义的,并且如果用户在包含之前定义__STDC_WANT_LIB_EXT1__为整数常量。 1<stdio.h>
参数
filename | 将文件流关联到的文件名 |
---|---|
mode | 以空字符结尾的字符串确定新的文件访问模式 |
返回值
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):