freopen_s, _wfreopen_s

重新分配一个文件指针。 这些是 freopen,_wfreopen 的版本与安全增强如 CRT中的安全功能所述。

errno_t freopen( 
   FILE** pFile,
   const char *path,
   const char *mode,
   FILE *stream 
);
errno_t _wfreopen( 
   FILE** pFile,
   const wchar_t *path,
   const wchar_t *mode,
   FILE *stream 
);

参数

  • [out] pFile
    调用将提供的文件指针的指针。

  • [in] path
    新文件路径。

  • [in] mode
    允许的访问类型。

  • [in] stream
    为 FILE 结构的指针。

返回值

这些函数都返回一个错误代码。 如果发生错误,原始文件已关闭。

备注

freopen_s 功能关闭文件当前与 stream 和重新 stream 到 path. 指定的文件 _wfreopen_s 是 _freopen_s的宽字符版本;为 _wfreopen_s 的 path 和 mode 参数是宽字符字符串。 _wfreopen_s 和 _freopen_s 否则具有相同的行为。

如果任何 pFile、path、mode或 stream 是 NULL,或者,如果 path 是空字符串,这些函数调用的参数无效处理程序,如 参数验证所述。 如果执行允许继续,对 EINVAL 的这些功能集 errno 和返回 EINVAL。

一般文本例程映射

TCHAR.H 实例

未定义的_UNICODE & _MBCS

定义的_MBCS

定义的_UNICODE

_tfreopen_s

freopen_s

freopen_s

_wfreopen_s

freopen_s 通常用于重定向之前打开的文件 stdin、stdout和 stderr 定向到用户指定的文件。 新的文件与 stream 如下打开与 mode*,* 是指定的访问类型字符字符串请求文件,例如:

  • "r"
    用于读取打开。 如果文件不存在或无法找到,freopen_s 调用失败。

  • "w"
    打开要编写的空文件。 如果给定文件存在,销毁其内容。

  • "a"
    为编写打开隐藏文件 (追加) 结束时,如果不移除 EOF 标记在编写新数据之前到文件中;,如果不存在,则先创建文件。

  • "r+"
    用于读取和写入打开。 (文件必须存在。)

  • "w+"
    打开读取和写入的空文件。 如果给定文件存在,销毁其内容。

  • "a+"
    用于读取和追加打开,追加的操作包括 EOF 标记中删除,新的数据写入文件之前,然后恢复 EOF 标记,在编写完成之后;,如果不存在,则先创建文件。

谨慎使用 "w" 和 "w+" 类型,因此,它们可能损坏现有文件。

当文件打开与 "a" 或 "a+" 访问类型时,所有写入操作发生在文件末尾。 使用 fseek 或 rewind,虽然文件指针可以被重新定位,文件指针总是移回文件的末尾,在所有写入操作之前。 因此,现有数据无法重写。

"a" 模式不在追加前移除 EOF 添加到文件。 在追加发生后,MS-DOS 类型命令只显示数据到原始 EOF 标记和没有任何数据追加到文件。 "a+" 模式在追加前移除 EOF 添加到文件。 在追加后,MS-DOS 类型命令文件中显示所有数据。 "a+" 模式对于追加需要于停止点与 CTRL+Z EOF 标记的流文件。

当 "r+","w+", 或 "a+" 访问类型指定,时读取和写入允许 (文件被视为打开“更新”)。 但是,那么,当您在读取和写入之间切换,必须有介入的 fsetposfseek倒带 操作。 如果需要当前位置可用于 fsetpos 或 fseek 操作指定。 除了上面的值,以下字符之一。mode 字符串可以包含为新行指定特定模式。

  • t
    打开在文本 (转换) 模式;支持返回换行符 (CR-LF) 组合转换为输入的唯一换行符 (LF) 字符;LF 字符转换为输出中 CR-LF 组合。 此外,CTRL+Z 被解释为编码的文件结尾字符。 如果可能在用于编写和读取打开的用于读取或文件与 "a+",运行库检查 CTRL+Z 在文件末尾并将其移除。 因为使用 fseek 和 ftell 在文件中移动可能导致 fseek 在文件末尾附近,不正常运行来完成的。 t 选项不应使用的 Microsoft 扩展 ANSI 可移植性需位置。

  • b
    打开二进制文件 (未转换的) 模式;上述转换被禁止。

如果 t 或 b 在 mode未给出,特定模式的默认值由全局变量 _fmode定义的。 如果 t 或 b 前缀给参数,则函数将失败并返回 NULL。

有关文本和二进制模式的讨论,请参见 文本和二进制架构文件 I/O

要求

功能

必需的标头

freopen_s

<stdio.h>

_wfreopen_s

<stdio.h> 或 <wchar.h>

控件个在 Windows 应用商店 apps 不受支持。 标准流处理与控件个,stdin,stdout和 stderr,在 C 运行时函数在 Windows 应用商店 apps 之前,可以使用它们必须重定向。 有关其他的兼容性信息,请参见中介绍的 兼容性

示例

// crt_freopen_s.c
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
 
#include <stdio.h>
#include <stdlib.h>

FILE *stream;

int main( void )
{
   errno_t err;
   // Reassign "stderr" to "freopen.out": 
   err = freopen_s( &stream, "freopen.out", "w", stderr );

   if( err != 0 )
      fprintf( stdout, "error on freopen\n" );
   else
   {
      fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
      fprintf( stream, "This will go to the file 'freopen.out'\n" );
      fclose( stream );
   }
   system( "type freopen.out" );
}
  

.NET Framework 等效项

请参见

参考

流I/O

freopen, _wfreopen

fclose, _fcloseall

_fdopen, _wfdopen

_fileno

fopen, _wfopen

_open, _wopen

_setmode