c语言之文件操作篇

目录

为什么要学习文件操作?

什么是文件?

文件指针

文件的操作

打开方式

文件操作的诸多函数 

fgetc()与fputc 实例

执行写入代码fputc()

 fputc()执行结果

​编辑

执行读取代码fgetc()

fgetc()执行结果 

​编辑 fgetc()、fputc()与fgets()、fputs()的区别

fwrite()与fread()

fwrite()

fread() 

执行写入代码fwrite()

fwrite()执行结果

​编辑执行读取代码fread()

 总结

文件版本通讯录管理系统


为什么要学习文件操作?

大家在运行通讯录等程序时,有没有发现这样一个问题:当我们运行程序并输入诸多联系人后结束程序,数据无法保留,当程序结束,我们输入的数据就会被清空。那么怎样才能将数据保留下来呢?这就是我们接下来要学习的内容。

什么是文件?

文件一般分为程序文件和数据文件。

程序文件:例如Windows环境下的源程序文件(.c),目标文件(.obj),可执行文件(.exe)。

数据文件:程序运行时读写的文件。之前我们学习的是从键盘输入数据,从显示屏输出数据。现在我们学习对磁盘上的文件进行输入输出。 

文件指针

系统对每一个被使用的文件都会在内存上创建文件信息区,存放文件的相关信息。这些信息存放在一个结构体变量中,该结构体取名为FILE,对于该结构体变量的具体实现我们不需要深度追究。

FILE* pf;//文件指针变量

我们要访问某个文件的时候,可以定义一个指针变量指向该文件的文件信息区。

接下来我们讲解如何操作指针变量。

文件的操作

打开方式

文件操作的诸多函数 

文件操作的函数十分之多,我们选择其中几个进行讲解:

fgetc()与fputc 实例

fgetc()为输入函数,fputc()为输出函数,注意:此处的输入输出是以磁盘上的文件为主体,即输出是向文件中写入文件,输入是从文件中读取文件。

执行写入代码fputc()
//fputc()
int main()
{
	FILE* pf = fopen("date.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
	}
	int ch = 'a';
	while (ch<'z'+1)
	{
		fputc(ch, pf);
		ch++;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}
 fputc()执行结果
执行读取代码fgetc()
// fgetc()
int main()
{
	FILE * pf=fopen("date.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
	}
	int c = 0;
	while ((c=fgetc(pf)) != EOF)
	{
		printf("%c ", c);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}
fgetc()执行结果 
 fgetc()、fputc()与fgets()、fputs()的区别

前者以字节为单位,后者以行为单位。

fwrite()与fread()

fwrite()

fread() 

执行写入代码fwrite()
//fwrite
int main()
{
	FILE* pfwrite = fopen("data.txt","wb");
	if (pfwrite == NULL)
	{
		perror("fopen");
		return 1;
	}
	char str[] = "This is a file!";
	fwrite(str, 1, sizeof(str), pfwrite);


	fclose(pfwrite);
	pfwrite = NULL;
	return 0;
}
fwrite()执行结果
执行读取代码fread()
//fread
int main()
{
	FILE* pfread = fopen("data.txt", "rb");
	if (pfread == NULL)
	{
		perror("fopen");
		return 1;
	}
	char str1[20] = { 0 };
	fread(str1, 1, 20, pfread);
	printf("%s", str1);
	fclose(pfread);
	pfread = NULL;
	return 0;
}

fread()执行结果

 总结

注意 :不知道大家有没有注意到在上述代码书写中有几个问题。

第一,每次对文件进行的操作都与对文件的打开方式息息相关。要写入就是写方式,要读取就是读方式。

譬如在上述fread()函数的使用中,我将“rb”改为了“wb”,引发了以下后果:

显示屏没有打印出之前我们写入的内容,文件夹也被清空。

第二,每次打开文件,都会对文件指针判断是否为NULL;而每次关闭文件,都会释放文件指针。与之前我们学习解动态管理内存时的原理相同。 

第三:对文件的操作步骤分为:打开文件、对文件进行操作(读写)、关闭文件。缺一不可。

最后,我们用一个简单的文件拷贝代码综合今天的内容。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pfread = fopen("data1.txt", "r");
	if (pfread == NULL)
	{
		perror("fopen data1");
		return 1;
	}
	FILE* pfwrite = fopen("data2.txt", "w");
	if (pfwrite == NULL)
	{
		perror("fopen data2");//如果frwrite打开失败
		fclose(pfread);//则关闭pfread
		pfread = NULL;
	}
	int ch = 0;
	//下面是对文件内容进行拷贝的循环
	while ((ch = fgetc(pfread)) != EOF)//fgetc()读取data1.txt的内容,遇到文件末尾,退出循环
	{
		fputc(ch, pfwrite);//fputc()将fgetc()读取的内容写入pfwrite指针
	}
	fclose(pfread);
	pfread = NULL;
	fclose(pfwrite);
	pfwrite = NULL;
	return 0;
}

大家自己运行一下,查看运行结果。

文件版本通讯录管理系统

如果需要程序结束后数据依旧保留的通讯录管理系统源码,可以私信我哦。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值