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使用modeas 指定的文件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):