%>
关闭当前与 oldStream
关联的文件,并将 stream
重新分配给 fileName
指定的文件。
这些版本的 freopen
、_wfreopen
具有安全性增强功能,如 CRT 中的安全性功能中所述。
语法
errno_t freopen_s(
FILE ** stream,
const char * fileName,
const char * mode,
FILE* oldStream
);
errno_t _wfreopen_s(
FILE ** stream,
const wchar_t * fileName,
const wchar_t * mode,
FILE * oldStream
);
参数
stream
一个 out 参数,该参数将在函数返回时指向重新打开的流。
fileName
要重新打开的文件的路径。
mode
重新打开的流的模式。
oldStream
要重新打开的流。 它已刷新,与之关联的任何文件都已关闭。
返回值
如果成功,则为零;否则为错误代码。 如果发生错误,则关闭原始文件并将 NULL
写入 stream
,除非 stream
也是 NULL
有关错误代码的详细信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
注解
freopen_s
函数通常用于将与 stdin
、stdout
和 stderr
关联的预先打开的流附加到另一个文件。
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
。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
一般文本例程映射
TCHAR.H 例程 |
_UNICODE 和 _MBCS 未定义 |
_MBCS 已定义 |
_UNICODE 已定义 |
---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
通常用于将预先打开的文件 stdin
、stdout
和 stderr
重定向到用户指定的文件。 与 stream
关联的新文件使用 mode
打开,它是指定文件要求的访问权限类型的字符串,如下所述:
mode |
Access |
---|---|
"r" |
打开以便读取。 如果文件不存在或找不到,freopen_s 调用将失败。 |
"w" |
打开用于写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
"a" |
在文件末尾打开以进行写入(追加),在新数据写入到文件之前不移除文件末尾 (EOF) 标记。 如果文件不存在,则创建文件。 |
"r+" |
打开以便读取和写入。 文件必须存在。 |
"w+" |
打开用于读取和写入的空文件。 如果文件存在,则其内容会被销毁。 |
"a+" |
打开以进行读取和追加。 追加操作包括在新数据写入文件之前移除 EOF 标记。 写入完成后,EOF 标记不会还原。 如果文件不存在,则创建文件。 |
使用 "w"
和 "w+"
类型时要小心,因为它们可能会破坏现有文件。 从 C11 开始,可以将 "x"
追加到 "w"
,或追加 "w+"
以使函数在该文件存在时失败,而不是覆盖该文件。
使用 "a"
或 "a+"
访问类型打开文件时,所有写入操作均将在文件末尾进行。 虽然使用 fseek
或 rewind
可重新定位文件指针,但在执行任何写入操作前,文件指针将始终被移回文件末尾。因此,无法覆盖现有数据。
在 EOF 标记追加到文件之前,"a"
模式会将其删除。 在追加后,MS-DOS TYPE 命令只显示原始 EOF 标记之前的数据,不显示追加到文件的任何数据。 在 EOF 标记追加到文件之前,"a+"
模式会将其删除。 在追加后,MS-DOS TYPE 命令显示文件中的所有数据。 需使用 "a+"
模式才能附加到通过 CTRL+Z EOF 标记终止的流文件。
指定 "r+"
、"w+"
或 "a+"
访问类型时,允许读取和写入(文件将处于打开状态以进行“更新”)。 但是,在读取与写入之间切换时,必须有中间 fsetpos
、fseek
或 rewind
操作。 如果需要的话,可以为 fsetpos
或 fseek
操作指定当前位置。 除上述值之外,还可以在 mode
字符串中包含以下字符之一以指定新行的转换模式。
mode 修饰符 |
转换模式 |
---|---|
t |
在文本(转换)模式下打开。 |
b |
在二进制(未转换)模式下打开;禁止涉及回车和换行字符的转换。 |
在文本(已转换)模式下,输入时,回车-换行 (CR-LF) 组合将转换为单一的换行 (LF) 字符;输出时,LF 字符将转换为 CR-LF 组合。 CTRL+Z 也将在输入时解释为文件尾字符。 在打开以便利用 "a+"
进行读取或读写的文件中,运行时库将检查文件末尾的 CTRL+Z,并在可能的情况下将其删除。 会移除它,因为使用 fseek
和 ftell
在文件中移动时,可能导致 fseek
在文件末尾附近错误运行。 如果需要 ANSI 可移植性,请不要使用 t
选项,因为它是 Microsoft 扩展。
如果 t
或 b
在 mode
中未给出,则默认转换模式由全局变量 _fmode
定义。 如果 t
或 b
是该参数的前缀,则函数将失败并返回 NULL
。
有关文本模式和二进制模式的讨论,请参阅文本和二进制模式文件 I/O。
要求
函数 | 必需的标头 |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> 或 <wchar.h> |
通用 Windows 平台 (UWP) 应用中不支持控制台。 与控制台、stdin
、stdout
和 stderr
关联的标准流句柄必须重定向,然后 C 运行时函数才能在 UWP 应用中使用它们。
有关兼容性的详细信息,请参阅 兼容性。
示例
// 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" );
}
successfully reassigned
This will go to the file 'freopen.out'
另请参阅
Stream I/O
%>
%>
%>
_fileno
%>
%>
_setmode