使用文件输入输出
前言
看到紫书上的这一部分,又挺久没写博客了,专门来写一篇文章吧。
意义
使用正常的标准输入输出(标准I/O,即直接读键盘、写屏幕),有时会造成每次执行都需要手动输入许多的数据,或者查看输出时因输出过多导致覆盖,无法查看前面的数据。这时候,使用文件输入输出可能是最佳的选择。
输入输出重定向
语句
只需在main函数的入口处加入以下两条语句:
freopen("input.text", "r", stdin);
freopen("output.text", "w", stdout);
示例
用一个计算乘积的程序示例,其中注释掉的第一行为定义宏,第五行到第八行的内容为条件编译,即定义宏product以后才会进行编译。当注释掉或删除掉第一行后,该程序使用标准输入输出,如果不注释或者删除,则使用文件输入输出。在竞赛中这样的写法,可以降低出错的可能。
//#define product
#include<stdio.h>
int main()
{
#ifdef product
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
int a,b;
scanf("%d %d", &a, &b);
printf("%d*%d=%d", a, b, a * b);
return 0;
}
fopen版
如果比赛要求使用文件输入输出,但禁止用重定向的方式时,可以使用fopen。
语句
fopen使用文件的方式具体有十二种,我的示例只涉及两种。
FILE *fin;//声明变量fin
fin = fopen("data.in","r");//fin为以只读方式打开data.in
fclose(fin);//关闭文件
示例
如果要将fopen转为标准输入输出,只需将变量的赋值改为stdin;或ftdout;即fin=stdin;,fout=ftdout;。
#include<stdio.h>
int main()
{
FILE *fin, *fout;//声明变量
fin = fopen("data.in", "rb");//rb为"文件必须存在,只允许读"
fout = fopen("data.out", "wb");//wb为"新建一个二进制文件,已存在的文件将内容清空,只允许写"
int a,b;
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d*%d=%d", a, b, a * b);
fclose(fin);
fclose(fout);
return 0;
}
对比
重定向与fopen各有优劣之处。重定向的写法更为简单,但是不能同时读写文件和标准输入输出;fopen方式稍显繁琐,但是灵活性更大(例如,可以反复打开并读写文件)。比赛时还是根据比赛要求进行选择。
评论列表