首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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使用modeas 指定的文件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到一个文件。

代码语言:javascript
复制
#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);
}

输出:

代码语言:javascript
复制
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 ++文档

扫码关注腾讯云开发者

领取腾讯云代金券