命名空间
变体
操作

freopen, freopen_s

来自 cppreference.cn
< c‎ | io
 
 
文件输入/输出
类型和对象
        
函数
文件访问
freopenfreopen_s
(C11)  
(C95)
非格式化输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
 
定义于头文件 <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 - 以 null 结尾的字符串,确定新的文件访问模式
stream - 要修改的文件流
newstreamptr - 指向一个指针的指针,函数将结果存储在此处(一个输出参数)

文件访问标志

文件访问
模式字符串
含义 解释 文件
已存在时的操作
文件
不存在时的操作
"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) 成功时返回零(并将 stream 值的副本写入 *newstreamptr),错误时返回非零(并将空指针写入 *newstreamptr,除非 newstreamptr 本身是空指针)。

注意

一旦流的窄/宽方向通过 I/O 操作或 fwide 建立,freopen 是改变它的唯一方法。

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