1. 什么是freopen函数?
freopen函数是C语言中的文件操作函数,它可以用于重新定向标准I/O流。当我们需要更改输入输出流的时候,可以使用freopen函数来实现。freopen函数的定义如下:
FILE * freopen(const char *filename, const char *mode, FILE *stream);
1.1 freopen函数的参数说明
freopen函数需要三个参数,分别为:
filename:文件名,它是一个指向以空字符结尾的字符串的指针,用于指定打开的文件名。
mode:文件模式,它是一个以空字符结尾的字符串指针,用于指定打开文件的模式。具体的模式列表如下:
模式 | 打开方式 | 如果文件不存在 | 如果文件存在 |
---|---|---|---|
r | 读取 | 打开失败 | 指针移到文件开头 |
w | 写入 | 创建文件 | 清空文件并从文件头开始写入 |
a | 追加 | 创建文件 | 直接从文件尾部开始写入 |
r+ | 读写 | 打开失败 | 指针移到文件头 |
w+ | 读写 | 创建文件 | 清空文件并从文件头开始写入 |
a+ | 读写 | 创建文件 | 直接从文件尾部开始写入 |
stream:这是一个指向文件结构体的指针,它指向我们要操作的文件。
1.2 freopen函数的返回值
freopen函数返回一个文件类型指针,如果返回值为null,则表明文件打开失败。
2. freopen函数的使用场景
freopen函数主要用于更改标准输入输出流的文件名。例如以下场景:
2.1 重定向标准输出
我们可以将标准输出重定向到一个文件,这样所有的printf语句输出都将被写入该文件:
freopen("output.txt", "w", stdout);
printf("Hello World!\n");
fclose(stdout);
这个程序会将“Hello World!”写入output.txt文件中。fclose函数的作用是关闭文件流。
2.2 重定向标准输入
我们也可以将标准输入重定向到一个文件,这样所有的scanf语句输入都将从该文件中读取:
freopen("input.txt", "r", stdin);
scanf("%d", &n);
fclose(stdin);
这个程序会将input.txt文件中的第一个整数读取到n中。fclose函数的作用是关闭文件流。
2.3 追加输出
我们可以将标准输出流追加到一个文件而不是覆盖原文件:
freopen("output.txt", "a", stdout);
printf("Hello World!\n");
fclose(stdout);
这个程序会将“Hello World!”追加到output.txt文件中。
2.4 重定向标准错误输出
同样,我们也可以将标准错误输出重定向到一个文件中:
freopen("error.txt", "w", stderr);
fprintf(stderr, "This is an error message.\n");
fclose(stderr);
这个程序会将“This is an error message.”写入到error.txt文件中。
3. 总结
freopen函数是一个非常实用的功能函数,它可以帮助我们更改标准输入输出流。在ACM竞赛和算法编程中,我们经常会遇到需要从输入文件中读取数据,并将数据输出到输出文件中的情况,这时我们就可以使用freopen函数来实现输入输出重定向。注意:当我们使用freopen函数进行文件流重定向之后,不要忘记恢复文件流。