C/C++语言文件操作中freopen与fopen的区别

       缘由:之前对于文件操作一直不熟悉,因为没怎么用到,所以也没怎么认真去学,但上次打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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值