缘由:之前对于文件操作一直不熟悉,因为没怎么用到,所以也没怎么认真去学,但上次打acm校训赛时,我出的一道题,别人用我的标程跑出来的数据与我自己跑出来的答案不一样,后来一位学长提醒了我,问我是不是把数据粘贴进控制台的,我这才知道原来windows的缓存区是不能放那么多数据的,当时我的数据大约是20W个字符。之后我把用文件操作数据进行读入,果然结果跟他们跑出来的一样了。
其实,文件操作,是一个程序连接现实发挥作用的桥梁,是非常有必要学习的,好了,不罗嗦了,下面说一下freopen与fopen这两个的使用方法以及区别,这是我当时遇到的第一个迷惑。(我尽量用白话文加例子说的明白一些)
首先,要加入头文件<stdio.h>或<cstdio>
函数格式为:FILE *freopen(const char *filename,const char *type, FILE *stream)
FILE * fopen(const char * filename, const char * mode)
具体各个参数含义请参考:http://www.cplusplus.com/reference/cstdio/freopen/
http://www.cplusplus.com/reference/cstdio/fopen/
这两个函数若执行成功,则返回一个所指定文件的指针;若失败,返回NULL
区别:
一:如果是fopen的话则可以对多个文件同时进行输入输出操作,也可以同时对文件和控制台进行操作,代码如下:
#include <iostream>
using namespace std;
int main()
{
FILE *fin, *fout;
fin = fopen("in.txt", "r");
fout = fopen("out.txt", "w");
char str[1000];
int a;
while (fscanf(fin, "%s", &str) != EOF)
{
scanf("%d", &a);
if (a == 1) break;
fprintf(fout, "%s\n", str);
printf("%s\n", str);
}
fclose(fin);
fclose(fout);
return 0;
}
二:如果是freopen的话,一方面你只能同时对一个文件进行读入或输出,比如你freopen一个文件进行读入,此时再freopen另一个文件进行读入,则重定向到这个文件,原来的流作废,当然对一个wen文件进行读入的同时对另一个文件进行输出则是可以的,另一方面,你不可以同时对文件和控制台进行同一种操作了,即要么在文件中读入,要么在控制台读入,输出亦如此,但是,你可以在文件读入然后在控制台进行输出,反过来亦如此。因此,它的方便之处是,你只需要对scanf和printf进行操作了,省去了fscanf和fprintf。同时,你可以利用宏来简化操作,比如如下代码:
#define TEST //此处注释与否影响下面的scanf与printf,能够瞬间切换输入输出的来源与去向
//(接上句)究竟是文件还是控制台呢?
#include <iostream>
using namespace std;
int main()
{
#ifdef TEST
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);省略一个就可以在文件读入而在控制台进行输出了
#endif
char str[1000];
while (scanf("%s", &str) != EOF)
{
printf("%s\n", str);
}
return 0;
}