在很多题目中,我们都要遇到需要打开文件的情况。现在我们来看一下如何使用 freopen
来打开文件。
首先,让我们来看一个例子:#20046. 「牛客CSP-J模拟赛3」A-有趣的游戏
#include
int main() {
FILE *fp;
fp = freopen("game.in", "r", stdin);
int s, a, b, c;
s = a = b = c = 0;
while (scanf("%1d", &s) == 1)
if (s == 6)
a++;
else if (s == 0)
b++;
else if (s == 1)
c++;
fp = freopen("game.out", "w", stdout);
if (a != 0 || b > c)
printf("Alice");
else
printf("Bob");
return 0;
}
我们来一行一行的看这些代码。
FILE *fp;
定义了一个 指向文件 的指针。你可以理解为我们输入输出时的“光标”。
fp = freopen("game.in", "r", stdin);
这句代码的意思是:我们先以 只读 方式以 标准输入流 打开文件 game.in
,然后将 fp
更新为 game.in
的“光标”,这样我们就能阅读 game.in
中的数据了。
接下来的不用管,我们来看下一句:
fp = freopen("game.out", "w", stdout);
这句代码的意思是:我们再以 只写 方式以 标准输出流 打开文件 game.out
,然后将 fp
更新为 game.out
的“光标,这样我们就能对 game.out
进行输入了。
除此之外没有任何需要注意的地方。
你大概也看到了,freopen
中的第一个元素是 文件名称 ,第二个元素是 打开方式 ,最后一个文件是 使用哪种标准流 。
总而言之,
freopen
的作用就是把 标准输入/输出流 stdin/stdout
重定向到文件中,这样在输入或输出时便不会从 标准输入/输出流 读取/写入 数据,而是 从文件中读取/写入 数据。
fclose
是文件关闭函数,使用时只要将重定向的指针作为参数即可。比如:
fclose(fp);
一些特殊文件:
CON 控制台(重定向至标准输入输出流)
DEL 删除文件(竞赛不可用)
NUL 空文件
HD 硬盘(竞赛不可用)
HDA 第一个硬盘(竞赛不可用)
RAM 内存
因此,如果在文件输入输出后还要进行标准输入输出,就可以这么写:
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);