freopen
函数 <cstdio>
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
以不同的文件或模式重新打开流
重新用流打开由filename(文件名)指定的文件或更改其访问mode(模式)。
如果指定了一个新的文件名,函数首先尝试关闭任何已经与stream关联的文件
(第三个参数)并将其解关联。然后,不管流是否成功关闭,
freopen打开filename指定的文件并将其与流关联起来,就像
fopen使用指定的模式一样。
如果filename是空指针,函数将尝试更改流的模式。尽管特定的库实现可以限制允许的更改,以及在什么情况下允许.
错误指示器和eof指示器被自动清除(就像调用了
clearerr一样)。
这个函数对于将预定义的流(如
stdin、
stdout和
stderr)重定向到特定的文件特别有用(参见下面的示例)。
☲ 参数
filename
C字符串,包含要打开的文件的名称。
其值应遵循运行环境的文件名规范,并可以包含路径(如果系统支持)。
如果此参数为空指针,则函数将尝试更改流的模式,就好像当前与该流关联的文件名已被使用一样。
mode
包含文件访问模式的C字符串。它可以是:
"r" |
read : 打开文件进行输入操作。文件必须存在。 |
"w" |
write : 为输出操作创建一个空文件。如果同名文件已经存在,则其内容将被丢弃,
并将该文件作为一个新的空文件处理。 |
"a" |
append : 打开文件并在文件末尾输出。输出操作总是将数据写在文件的末尾,
将其展开。重定位操作(fseek,
fsetpos,
rewind)被忽略。如果文件不存在,则创建该文件。 |
"r+" |
读取/更新 : 打开一个文件进行更新(用于输入和输出)。文件必须存在。 |
"w+" |
写/更新 : 创建一个空文件并打开它进行更新(用于输入和输出)。
如果同名文件已经存在,则其内容将被丢弃,并将该文件作为一个新的空文件处理。 |
"a+" |
append/update:打开一个文件进行更新(包括输入和输出),
将所有的输出操作写入文件的末尾。重定位操作(fseek,
fsetpos,
rewind)
影响下一个输入操作,但输出操作将位置移回文件末尾。如果文件不存在,则创建该文件。 |
使用上面的模式说明符,文件将作为文本文件打开。
为了以二进制文件的形式打开文件,模式字符串中必须包含一个“b”字符。
这个额外的“b”字符可以被附加在字符串的末尾(这样就形成了以下复合模式:
“rb”,“wb”,“ab”,“r+b”,“w+b”,“a+b”)
或者插入字母和“+”符号之间的混合模式(“rb+”,“wb+”,“ab+”)。
新的C标准(C2011,不是c++的一部分)增加了一个新的标准子说明符("x"),
它可以被附加到任何"w"说明符(形成"wx", "wbx", "w+x"或"w+bx"/"wb+x")。
如果文件存在,这个子说明符强制函数失败,而不是覆盖它。
如果序列后面有额外的字符,则行为取决于库的实现:
一些实现可能会忽略额外的字符,以便接受额外的“t”(有时用于显式声明文本文件)。
在某些库实现中,打开或创建具有更新模式的文本文件可能会将流视为二进制文件。
stream
指向FILE对象的指针,该对象标识要重新打开的流。
☉ 返回值
如果文件成功重新打开,该函数将返回作为参数stream传递的指针,该参数stream可用于标识重新打开的流。
否则,返回一个空指针。
在大多数库实现中,
errno变量也会在出现故障时设置为系统特定的错误代码。
☣ 示例
/* freopen example: redirecting stdout */
#include <stdio.h>
int main ()
{
freopen ("myfile.txt","w",stdout);
printf ("This sentence is redirected to a file.");
fclose (stdout);
return 0;
} |
这个示例代码将通常会进入标准输出的输出重定向到一个名为myfile.txt的文件,该文件在程序执行后包含:
This sentence is redirected to a file
🍄 另请参阅