freopen, freopen_s

来自cppreference.com
< 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 打开 filename 所指定的文件,如同用 fopen ,然后将该文件与 stream 所指向的文件流关联。若 filename 为空指针,则函数试图重打开已与 stream 关联的文件(此情况下是否允许模式改变是实现定义的)。
2)(1) ,除了以 fopen_s 中的方式处理 mode ,并将指向文件流的指针写入 newstreamptr ,还在运行时检测下列错误,并调用当前安装的制约处理函数:
  • newstreamptr 是空指针
  • stream 是空指针
  • mode 是空指针
同所有边界检查函数, freopen_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 <stdio.h> 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

filename - 要关联到文件流的文件名
mode - 确定文件访问模式的空终止字符串
文件访问
模式字符串
含义 解释 若文件已存在的动作 若文件不存在的动作
"r" 打开文件以读取 从头读 打开失败
"w" 创建文件以写入 销毁内容 创建新文件
"a" 后附 后附到文件 写到结尾 创建新文件
"r+" 读扩展 打开文件以读/写 从头读 错误
"w+" 写扩展 创建文件以读/写 销毁内容 创建新文件
"a+" 后附扩展 打开文件以读/写 写到结尾 创建新文件
文件访问模式标签 "b" 可以可选地指定以二进制模式打开文件。此标签仅在 Windows 系统上生效。
在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
当文件以更新模式打开时( '+' 作为上述模式参数值列表的第二或第三个字符),访问流可以进行输入和输出。然而输出不应直接紧随输入,而中间无对 fflush 函数或对文件定位函数( fseekfsetposrewind )的调用,且输入不应直接紧随输出,而中间无对文件定位函数的调用,除非输入操作遇到文件尾。在一些实现中,以更新模式打开(或创建)文本文件可能取代打开(或创建)二进制流。
文件访问模式标签 "x" 可以可选地后附于 "w" 或 "w+" 指定符。若文件存在,则此标签强制函数失败,而不重写它。(C11)
使用 fopen_sfreopen_s 时,任何以 "w" 或 "a" 创建的文件的文件访问许可禁止其他用户访问它。文件访问模式标签 "u" 可以可选地前附于任何以为 "w" 或 "a" 始的指定符,以启用默认的 fopen 许可。(C11)
stream - 要修改的文件流
newstreamptr - 指向函数存储结果所用指针的指针(输出参数)

返回值

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

注意

freopen 是一旦由 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"); // 写入 redir.txt
    fclose(stdout);
}

输出:

stdout is printed to console

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.5.4 The freopen function (p: 307)
  • K.3.5.2.2 The freopen_s function (p: 590)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.5.4 The freopen function (p: 272-273)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.5.4 The freopen function

参阅

打开文件
(函数)
关闭文件
(函数)