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+" 访问类型时,允许读取和写入(文件将处于打开状态以进行“更新”)。 但是,那么,当您在读取和写入之间切换,必须有介入的 fsetpos、fseek或 rewind 操作。 如果需要当前位置可用于 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" );
}