freopen
在标题中定义<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) |
返回值
1)stream
成功的值的副本,失败时的空指针。
2)成功时为零(并且stream
写入的值的副本,*newstreamptr
错误时不为零(并且空指针被写入,*newstreamptr
除非newstreamptr
它本身是空指针)。
注意
freopen
是通过I / O操作或通过I / O操作建立后,改变流的窄/宽方向的唯一方法fwide
。
例
以下代码重定向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函数
fopenfopen_s(C11) | 打开一个文件(函数) |
---|---|
FCLOSE | 关闭文件(函数) |
| 用于freopen的C ++文档
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com