freopen、_wfreopen

重新分配一个文件指针。 有关这些函数的更多安全版本,请参见 freopen_s、_wfreopen_s

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

参数

  • path
    新文件路径。

  • mode
    允许访问的类型。

  • stream
    指向 FILE 结构的指针。

返回值

这些函数均返回指向最近打开文件的指针。 如果发生错误,原始文件关闭,并且该函数返回 NULL 指针值。 如果 path , mode或stream为空指针,或如果filename为空字符串,这些函数将调用无效参数处理程序,如参数验证 所述。 如果允许继续执行,则这些函数将 errno 设置为 EINVAL,并返回NULL。

有关这些内容的更多信息以及其他错误代码,请参见 _doserrno、errno、_sys_errlist 和 _sys_nerr

备注

有关更多这些函数的安全版本,请参见 freopen_s,_wfreopen_s

freopen 函数关闭与当前 stream 联系的文件并重新分配 stream 到 path指定的文件*.* _wfreopen是_freopen的宽字符版本;path和 mode传递给_wfreopen的参数是宽字符字符串。 否则_wfreopen 和 _freopen 行为相同。

一般文本例程映射

TCHAR.H 例程

未定义 _UNICODE & _MBCS

已定义 _MBCS

已定义 _UNICODE

_tfreopen

freopen

freopen

_wfreopen

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

  • "r"
    打开以便读取。 如果文件不存在或找不到,freopen 调用将失败。

  • "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

<stdio.h>

_wfreopen

<stdio.h> 或 <wchar.h>

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

示例

// crt_freopen.c
// compile with: /W3
// 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 )
{
   // Reassign "stderr" to "freopen.out": 
   stream = freopen( "freopen.out", "w", stderr ); // C4996
   // Note: freopen is deprecated; consider using freopen_s instead

   if( stream == NULL )
      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

fclose、_fcloseall

_fdopen、_wfdopen

_fileno

fopen、_wfopen

_open、_wopen

_setmode