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 是空字符串,这些函数调用无效参数处理程序,正如 参数验证中描述的。 如果允许继续执行,则这些函数将 errno 设置为 EINVAL,并返回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 TYPE 命令只显示原始 EOF 标记之前的数据,不显示追加到文件的任何数据。 "a+" 模式在追加到文件前不移除 EOF 标记。 在追加后,MS-DOS TYPE 命令显示文件中的所有数据。 需使用 "a+" 模式才能附加到通过 CTRL+Z EOF 标记终止的流文件。

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

  • t
    在打开文本(翻译)模式,回车,换行(CR-LF)组合转换成单个换行符(LF)字符的输入; LF字符被转换为输出CR-LF组合。 此外,CTRL+Z 被解释为输入的文件结尾字符。 如果可能在用于编写和读取打开的用于读取或文件与 "a+",运行库选定的 CTRL+Z 在文件末尾和移除它。 这是因为使用 fseek 和 ftell 在以 CTRL+Z 结尾的文件中移动时,可能导致 fseek 在文件末尾附近错误运行。 t 选项不应使用的基于扩展 ANSI 可移植性需位置。

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

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

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

要求

功能

必需的标头

freopen_s

<stdio.h>

_wfreopen_s

<stdio.h> 或 <wchar.h>

控制台在 Windows 应用商店 应用程序中不受支持。 与控制台 stdin、stdout 和 stderr 关联的标准流句柄必须重定向,然后 C 运行时函数才可以在 Windows 应用商店 应用程序中使用它们。 有关兼容性的更多信息,请参见兼容性

示例

// 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