一、什么是文件操作?
01.在我们电脑的硬盘中,有很多如(.test)(.exe)等都被称之为文件
02.在程序设计中,我们一般探讨的文件主要有两种:
程序文件
数据文件
程序文件:
程序文件包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)
数据文件:
当程序文件运行时有时需要读取数据,这些数据有时来源于键盘输入(如通过scanf()函数给变量赋值),有时则来源于文件,这种文件称之为数据文件,即给程序读取数据的文件。
如果还没学过读取文件的操作,可能无法理解,这里举一个例子:
//有一个data.txt文件
//这个文件称之为数据文件,它的内容是一个数字20.
//现在程序要读取这个文件里面的数字20,将20赋值给变量a
//具体操作如下:
int main()
{
//创建变量 int a
//打开文件(data.txt)
//读取该数据文件里面的数据20,并赋值给a
//结果:a=20
return 0;
}
二、文件名
文件名的作用?
当我们需要使用程序读取文件内容的时候,程序怎么知道要读取哪一个文件?
这就很像我们进入一个新班级,我们要找到一个叫小明的人,首先你不知道他是谁,但你至少知道他的名字是小明,知道名字,自然可以找到小明,即使你不知道小明长什么样。
文件名的作用也是如此,可以帮助程序找到一个具体的文件。
文件名组成
文件名一般包括3个部分:
文件路径+文件名主干+文件后缀
比如:E:\code\test.c\test.txt (根据颜色划分)
三、文件分类
根据文件的组织形式。数据文件称为文本文件或者二进制文件。
二进制文件:
我们知道,数据在内存中以二进制的形式存储,如果不加转换地输出到外存文件中,这就是二进制文件。
文本文件:
如果二进制存储的数据以ASCII码的形式输出到外存文件中,这种以ASCII字符的形式存储的文件就是文本文件。
以数字10000的两种存储形式举例:
二进制文件:
这里看到数字100000的二进制存储方式只占4个字节,所以文件存储的内容为:
00000000 00000000 00100111 00010000
文本文件:
这里由于数字10000是由ASCII码形式存储,所以每个数字被拆分为字符来存储,它的二进制数据一共占5个字符,经过转换,所以文本文件存储的内容为:
10000
四、流的概念
1、流
一个程序,需要从外界设备获取数据,如键盘输入、网络输入等,也可以向外界输出数据,如打印到屏幕、发送数据到网络等,不同设备的输入输出方式各不相同,为了方便程序员对各设备进行输入输出操作,我们可以抽象出来一个流的概念,C程序对文件,画面·,键盘的输入,屏幕的输出操作都是通过流操作的。
没有流概念之前:
没有流这个概念之前,对不同设备进行数据输入和输出需要通过各种不同的方法才能够实现,数据的输入输出具体关系如图:
有了流概念之后:
有了流之后,数据输入输出的关系则是这样的:
一般情况下,我们从流中获取数据,或者从流中写入数据,都要打开流,然后才能进行流操作。
如果看到这里还是不太懂,没关系,进一步往下看,会加深你对于这个抽象出来的流概念的理解。
2、标准流
既然键盘的输入(使用scanf()函数从键盘读取数据)、屏幕的输出(使用printf()函数向屏幕打印内容)也是一种数据输入和输出方式,那么我们一直在用,为什么却没有进行前面所说的打开流的操作呢?
这是因为:在C程序启动的时候,默认打开了3个标准流。
3种标准流:
01.stdin ——标准输入流,scanf从标准输入流中读取数据
02.stdout——标准输出流,printf就是将信息输出到标准输出流中
03.stderr——标准错误流
这三种标准流的本质是变量,他们的类型是FILE*,他们也被称为文件指针。
3、文件指针
当使用一个文件时,内存会自动开辟一块文件信息区,用来存放文件信息,比如文件名、文件状态、文件的位置,这些文件信息存储在一个结构体变量中,该结构体的类型由系统声明:为FILE。
究竟系统如何声明的呢?就是利用typedef重命名结构体变量类型的方式。大概就是以下这种方式。
typedef struct information
{
char name[30];//文件名
char location[30];//文件位置
int date;//文件创建日期
}FILE;