freopen ()- 重定向打开的文件
格式
#include <stdio.h>
FILE *freopen(const char *filename, const char *mode, FILE *stream);语言级别
ANSI
线程安全
是
描述
freopen() 函数关闭当前与 流 关联的文件,并将 流 重新分配给 filename指定的文件。 freopen() 函数打开与具有给定 方式的 流 关联的新文件,这是一个字符串,用于指定为该文件请求的访问类型。 您还可以使用 freopen() 函数将标准流文件 stdin, stdout和 stderr 重定向到您指定的文件。
对于数据库文件,如果 filename 是空字符串,那么 freopen() 函数将关闭流并将其重新打开到新的打开方式,而不是将其重新分配到新的文件或设备。 可以使用未指定文件名的 freopen() 函数将标准流的方式从文本更改为二进制,而不重定向流,例如:
fp = freopen("", "rb", stdin);您可以使用相同的方法将方式从二进制更改为文本。
不能将带有 filename 的 freopen() 函数用作使用 SYSIFCOPT (*IFSIO) 创建的模块中的空字符串。
返回值
freopen() 函数返回指向新打开的流的指针。 如果发生错误,那么 freopen() 函数将关闭原始文件并返回 NULL 指针值。
errno 的值可以设置为:
- 值
- 含义
- EBADF
- 文件指针或描述符无效。
- EBADMODE
- 指定的文件方式无效。
- EBADNAME
- 指定的文件名无效。
- ENOENT
- 无文件或库。
- ENOTOPEN
- 文件未打开。
- EIOERROR
- 发生了不可恢复的I/O错误。
- EIORECERR
- 发生了可恢复的I/O错误。
示例
此示例关闭 stream1 数据流并重新分配其流指针。 stream1 和 stream2 将具有相同的值,但它们不一定具有与 stream相同的值。
#include <stdio.h>
#define MAX_LEN 100
int main(void)
{
FILE *stream, *stream1, *stream2;
char line[MAX_LEN], *result;
int i;
stream = fopen("mylib/myfile","r");
if ((result = fgets(line,MAX_LEN,stream)) != NULL)
printf("The string is %s\n", result);
/* Change all spaces in the line to '*'. */
for (i=0; i<=sizeof(line); i++)
if (line[i] == ' ')
line[i] = '*';
stream1 = stream;
stream2 = freopen("", "w+", stream1);
fputs( line, stream2 );
fclose( stream2);
}