Namespaces
Variants

freopen, freopen_s

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
(1)
FILE * freopen ( const char * filename, const char * mode,
FILE * stream ) ;
(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 非空指针,则尝试使用 mode 参数按 fopen 的方式打开 filename 指定的文件,并将该文件与 stream 指向的文件流关联。若 filename 为空指针,则函数尝试重新打开已与 stream 关联的文件(此时允许哪些模式变更由实现定义)。
2) (1) 相同,区别在于 mode 按照 fopen_s 的方式处理,且文件流指针将被写入 newstreamptr ,并在运行时检测以下错误,触发当前安装的 约束处理函数
  • newstreamptr 是空指针
  • stream 是空指针
  • mode 是空指针
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 且用户在包含 <stdio.h> 前将 __STDC_WANT_LIB_EXT1__ 定义为整型常量 1 时,才保证 freopen_s 可用。

目录

参数

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

参考文献

  • 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