命名空间
变体

freopen、freopen_s

来自 cppreference.com
< c‎ | io
 
 
文件输入/输出
类型和对象
函数
文件访问
freopenfreopen_s
(C11)
(C95)
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
格式化输入
(C99)(C99)(C99)(C11)(C11)(C11)     
 
定义在头文件 <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) 相同,只是 mode 的处理方式与 fopen_s 相同,并且文件流指针被写入 newstreamptr,并且以下错误在运行时被检测到并调用当前安装的 约束处理程序 函数
  • newstreamptr 是空指针
  • stream 是空指针
  • mode 是空指针
与所有边界检查函数一样,仅当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdio.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,freopen_s 才保证可用。

内容

参数

filename - 要与文件流关联的文件名
mode - 空终止字符字符串,确定新的 文件访问模式
stream - 要修改的文件流
newstreamptr - 指向指针的指针,函数将结果存储在该指针中(输出参数)

文件访问标志

文件访问
mode 字符串
含义 解释 如果文件
已存在
如果文件
不存在
"r" 打开文件以供读取 从开头读取 无法打开
"w" 创建文件以供写入 销毁内容 创建新的
"a" 追加 将数据追加到文件 写入末尾 创建新的
"r+" 扩展读 打开文件以供读写 从开头读取 错误
"w+" 扩展写 创建文件以供读写 销毁内容 创建新的
"a+" 扩展追加 打开文件以供读写 写入末尾 创建新的
文件访问模式标志 "b" 可以选择性地指定以二进制模式打开文件。此标志对 POSIX 系统没有影响,但在 Windows 上它会禁用对 '\n''\x1A' 的特殊处理。
在追加文件访问模式下,无论文件位置指示器的当前位置如何,数据都会写入文件末尾。
如果模式不是上面列出的字符串之一,则行为未定义。一些实现定义了其他支持的模式(例如 Windows)。
在更新模式 ('+') 中,可以执行输入和输出,但输出不能后跟输入,除非在之间调用 fflushfseekfsetposrewind,输入不能后跟输出,除非在之间调用 fseekfsetposrewind,除非输入操作遇到文件结尾。在更新模式下,即使指定了文本模式,实现也可以使用二进制模式。
文件访问模式标志 "x" 可以选择性地附加到 "w""w+" 说明符。此标志强制函数在文件存在时失败,而不是覆盖它。 (C11)
当使用 fopen_sfreopen_s 时,使用 "w""a" 创建的任何文件的访问权限会阻止其他用户访问它。文件访问模式标志 "u" 可以选择性地预先添加到任何以 "w""a" 开头的说明符,以启用默认的 fopen 权限。 (C11)

返回值

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

备注

freopen 是唯一可以更改流的窄/宽方向的方式,一旦通过 I/O 操作或 fwide 建立了流的窄/宽方向,就无法再更改它。

Microsoft CRT 版本的 freopenfilename 是空指针时不支持任何模式更改,并将其视为错误(参见 文档)。一个可能的解决方法是非标准函数 _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 函数 (p: 224-225)
  • K.3.5.2.2 freopen_s 函数 (p: 429-430)
  • 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 函数

另见

打开文件
(函数) [编辑]
关闭文件
(函数) [编辑]
C++ 文档 针对 freopen