实现文件读写操作的freopen和fopen区别和使用

本文详细对比了fopen和freopen函数在文件读写操作中的应用,讲解了如何利用这两个函数进行文件输入输出,并介绍了freopen函数的便利性和高级用法,包括如何将文件读写与标准输入输出流相结合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入:https://blog.youkuaiyun.com/xavierdarkness/article/details/80638641
两个函数都需要输入文件
我们先要在自己的D盘建立一个输入文件:
input文件夹:里面包含:1的文件
在这里插入图片描述
在这里插入图片描述
就是用记事本事先吧你要输入的数据放在那里,我们打开文件夹就是这样的:
在这里插入图片描述
这个文件里面有我们要输入的数据:
6
7 7 2 0 0 2
现在先使用fopen函数打开:

#include<bits/stdc++.h>
using namespace std;
long long int mod=1000000007;
int main(void)
{
	int n;
	long long int a[105];
	//fopen中: r是打开文件只读 w 是只进行写
	FILE *fp;
	fp=fopen("D:\\input\\1.txt","r+");
	fscanf(fp,"%d",&n);
	for(int i=1;i<=n;i++){
		fscanf(fp,"%lld",&a[i]);
	}
	long long int sum=0ll;
	sum=a[1]+a[n];
	//此时文件内是6
    //7 7 2 0 0 2 
	printf("%lld\n",sum);//输出sum
	fprintf(fp,"%d",n);//写入n
	for(int i=1;i<=n;i++){
		fprintf(fp,"%lld",a[i]);//写入a[i],a[i]没变,
	}//fprintf函数的作用是把数据写入文件内
	//现在是6
    //7 7 2 0 0 26772002 
    //fprintf把n,a[i]的值写入文件内 
	fclose(stdin);
	return 0;
}

我们可以看到用用fopen()函数打开的文件,我们录入文件时还要特意去更改程序的输入方法,scanf()->fscanf();而freopen则不用
feropen:

#include<bits/stdc++.h>
using namespace std;
long long int mod=1000000007;
int main(void)
{
	int n;
	long long int a[105];
	freopen("D:\\input\\1.txt","r",stdin);//stdout(Standardoutput)标准输出 stdin(Standardinput)标准输入
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	long long int sum=0ll;
	sum=a[1]+a[n];
	printf("%lld\n",sum);
	fclose(stdin);
	return 0;
}

输出都是9

freopen和fopen都可以读取文件到程序,但是后者需要将scanf()改为fscanf()才能正常使用,前者则不用。看来freopen函数更方便点。

补充1:
如果你还想更简单的又不必大动干戈修改程序,那么你可以用

freopen("D:\\input\\1.txt","w",stdout);//stdout(Standardoutput)标准输出 stdin(Standardinput)标准输入

其中stdout(Standardoutput)标准输出是输出到磁盘,就是录入文件内, stdin(Standardinput)标准输入是输出到屏幕上,如最后一个程序,我们改一句话,输入(手动)

6
7 7 2 0 0 2

就是把答案 9 写进文件,而屏幕上不显示

#include<bits/stdc++.h>
using namespace std;
long long int mod=1000000007;
int main(void)
{
	int n;
	long long int a[105];
	freopen("D:\\input\\1.txt","w",stdout);//stdout(Standardoutput)标准输出 stdin(Standardinput)标准输入
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	long long int sum=0ll;
	sum=a[1]+a[n];
	printf("%lld\n",sum);
	fclose(stdin);
	return 0;
}

运行结果为屏幕上没有输出,文件1.txt里面内容只有一个9。

补充2:
如果你想实现一个文件读,一个文件(1.txt)输入,一个文件(2.txt)写入相应结果数据的话,可以写两句

	freopen("D:\\input\\1.txt","r",stdin);//将1.txt作为程序的标准输入
	freopen("D:\\input\\2.txt","w",stdout);//将2.txt作为程序的标准输出

文件结构如下图:
在这里插入图片描述
代码(将输入的输入的头尾相加输出):

#include<bits/stdc++.h>
using namespace std;
long long int mod=1000000007;
int main(void)
{
	int n;
	long long int a[105];
	freopen("D:\\input\\1.txt","r",stdin);//将1.txt作为程序的标准输入
	freopen("D:\\input\\2.txt","w",stdout);//将2.txt作为程序的标准输出
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	long long int sum=0ll;
	sum=a[1]+a[n];
	printf("%lld\n",sum);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

运行结果如下:

输入文件1.txt:
在这里插入图片描述
输出文件2.txt:
在这里插入图片描述
这样便可实现一个程序的输入和输出都是到文件,而不用自己输入,同时程序也不用另外修改输入输出函数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值