Namespaces
Variants

freopen, freopen_s

来自 zh.cppreference.net
 
 
文件输入/输出
类型和对象
        
函数
文件访问
(C95)
非格式化输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
 
定义于头文件 <stdio.h>
FILE* freopen( const char* filename, const char* mode,
               FILE* stream );
(1) (至C99)
FILE* freopen( const char* restrict filename, const char* restrict mode,
               FILE* restrict stream );
(自C99起)
errno_t freopen_s( FILE* restrict* restrict newstreamptr,
                   const char* restrict filename, const char* restrict mode,
                   FILE* restrict stream );
(2) (自C11起)
1) 首先,尝试关闭与stream关联的文件,忽略任何错误。然后,如果filename不为空,则尝试使用filename打开由mode指定的文件,如同通过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 - 决定新 文件访问模式 的空终止字符串
stream - 待修改的文件流
newstreamptr - 用于存储函数结果的指针的指针(输出参数)

文件访问标志

文件访问
模式字符串
含义 说明 文件已存在时的操作 文件不存在时的操作
"r" read 打开文件用于读取 从起始位置读取 打开失败
"w" write 创建文件用于写入 销毁内容 创建新文件
"a" append 追加到文件 写入到末尾 创建新文件
"r+" read extended 打开文件用于读写 从起始位置读取 错误
"w+" write extended 创建文件用于读写 销毁内容 创建新文件
"a+" append extended 打开文件用于读写 写入到末尾 创建新文件
文件访问模式标志 "b" 可选择性地指定以二进制模式打开文件。此标志在 POSIX 系统上无效,但在 Windows 上会禁用对 ' \n ' 和 ' \x1A ' 的特殊处理。
在追加文件访问模式下,无论文件位置指示器的当前位置如何,数据都将写入文件末尾。
如果模式不是上述列出的字符串之一,则行为未定义。某些实现定义了额外的支持模式(例如 Windows )。
在更新模式( '+' )下,可以执行输入和输出操作,但输出操作后若不调用 fflush 、 fseek 、 fsetpos 或 rewind 则不能立即进行输入操作;输入操作后若不调用 fseek 、 fsetpos 或 rewind 则不能立即进行输出操作,除非输入操作已遇到文件结尾。在更新模式下,即使指定了文本模式,实现也允许使用二进制模式。
文件访问模式标志 "x" 可选择性地附加到 "w" 或 "w+" 说明符。此标志强制函数在文件已存在时失败,而不是覆盖该文件。 (C11)
当使用 fopen_s 或 freopen_s 时,使用 "w" 或 "a" 创建的任何文件的访问权限会阻止其他用户访问该文件。文件访问模式标志 "u" 可选择性地前置到任何以 "w" 或 "a" 开头的说明符,以启用默认的 fopen 权限。 (C11)

返回值

1)的值的副本stream成功时,失败时返回空指针。
2)成功时返回零(并将值的副本stream写入到*newstreamptr,错误时返回非零(并将空指针写入到*newstreamptr,除非newstreamptr本身是空指针)。

注释

freopen是更改流的窄/宽方向的唯一方式,一旦该方向已由 I/O 操作或 fwide 建立。

Microsoft CRT 版本的 freopen 在 filename 是空指针时不支持任何模式更改,并将其视为错误(请参阅 文档)。一个可能的变通方法是使用非标准函数 _setmode()。

示例

以下代码将 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);
    return EXIT_SUCCESS;
}

输出:

stdout is printed to console

参考文献

  • C23 标准(ISO/IEC 9899:2024):
  • 7.21.5.4 freopen 函数(页码:待定)
  • K.3.5.2.2 freopen_s 函数(页码:待定)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.21.5.4 freopen 函数(页码:224-225)
  • K.3.5.2.2 freopen_s 函数(页码:429-430)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.21.5.4 freopen 函数(页码:307)
  • K.3.5.2.2 freopen_s 函数(页码:590)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.19.5.4 freopen 函数(页码:272-273)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.9.5.4 freopen 函数

参见

打开文件
(函数)
关闭文件
(函数)
C++ 文档 关于 freopen