前言
本文主要讲解文件的基础概念,我会给大家讲解我们为什么会使用到文件这种东西,以及文件的分类。本文主要以提问的方式来展开话题。
希望读者们能沉下心来,好好思考!💖💖💖
1. 为什么会使用文件?
我先给大家一个简单的代码:
#include<stdio.h>
int main()
{
int a = 0;
printf("%d\n",a);
scanf("%d",&a);
printf("%d\n",a);//当我再次运行这段代码时,一开始a的值还会是之前我输入的值吗?
return 0;
}
这段代码很简单,我想给大家表达的意思是,我第一次运行这段代码,调用scanf函数通过键盘给变量a输入一个值,然后程序就结束了。那么问题来了,当我再次运行这段代码时,我之前给变量a的值消失不见了。
到这里我们就发现了一个问题,我们程序的数据随着程序的结束就会消失不见了。其背后的原理也很简单,随着程序的结束,操作系统会自动回收内存空间里面的内容,而我们程序的数据就是在内存中存储的。
那我们就会想到能不能用一个外部的容器在程序还未结束时,就将一些关键的数据给保存起来。文件这时就能够大展身手了。
所以,文件的作用就是对数据的持久化保存,不让数据随着程序的退出而消失。这也就是我们使用文件的原因。
2. 什么是文件?
在上面我提到了一个外部容器来存储数据,那个外部容器就是“硬盘”。
硬盘(磁盘)上的文件就是文件。
但是在程序设计中,我们一般只讨论两种文件:数据文件、程序文件(从文件功能角度进行划分)。
2.1 程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行文件(windows环境后缀为.exe)。
这些文件的后缀大家在编程时或多或少都接触过,就不详细展开来讲了。
程序文件不是我们学习的重点,大家了解即可。数据文件才是我们学习的重点!
2.2 数据文件
文件的内容不一定是程序,也可以是程序运行时读写的数据,比如:程序运行需要从读取文件的数据,或输出内容到文件中。
总而言之,数据文件就是程序运行时数据流动的一个起点和终点。
回想我们之前所处理数据的输出和输入都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
其实有的时候我们也会将信息输出到磁盘上,当需要的时候再从磁盘中把信息给读取到内存中使用,这里就是在操作磁盘上的文件。
2.3 文件名
一个文件要有一个唯一的标识,方便用户在茫茫文件中识别和引用。
就像我们的身份证一样,每个人的身份证都是独一无二的,看到身份证我就知道这个人就是你了。
文件名包括三个部分:文件路径 + 文件名主干 + 文件后缀
例如:c:\code\test.txt
其中,**c:\code**,就是该文件的路径;test就是文件名主干;.txt是文件后缀。
为了方便起见,我们常把文件标识就称作文件名。
3. 二进制文件和文本文件
上面我们提到的数据文件和程序文件,是基于文件功能的角度出发的。
根据数据的组织形式,数据文件又可以被分为二进制文件和文本文件。
数据在内存中是以二进制的形式来存储的,如果不加以任何的形式直接输出到外存的文件中,就是二进制文件。
如果要求在外存上以ASCII码形式来存储,则需要在存储之前进行转换。以ASCII码形式输出到外存的文件中,就是文本文件。
这里我就写给大家一段代码,感受一下文本文件和二进制文件:
#include<stdio.h>
int main()
{
int num = 10;
//打开文件
FILE* pf = fopen("test.txt","wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fwrite(&num,sizeof(num),1,pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt","w");
if (pf == NULL)
{
perror(pf);
return 1;
}
fputs("123456",pf);
fclose(pf);
pf = NULL;
return 0;
}
以上就是二进制文件和文本文件的详细讲解了。
总结
本文给大家传递一个信息就是文件的重要性,以及文件的分类。这些对我们后续学习文件操作是很有必要的,希望读者们能够好好的理解。