1.为什么要学习文件操作?
我们编写的程序在运行时会在内存中开辟一块空间来存放我们的数据,但当程序结束后,数据就会丢失。但我们使用电脑时可以发现,我们的数据会一直保存下来,那么这是为什么,就是因为电脑使用了文件来保存数据,所以我们要学习文件操作。
2.文件的分类
在程序设计中一般有两种文件:一种是程序文件,一种是数据文件(按照文件功能的角度来分类)
(1)程序文件:
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows 环境后缀为.exe)。
(2)数据文件:
顾名思义,数据文件就是存放数据的文件。例如,程序运行中要用到的数据就会存放在数据文件中。我们这主要讨论数据文件。
而数据文件又根据其在外存中的存放方式分为文本文件和二进制文件。
二进制文件:数据在内存中都是以二进制的方式存放的,但当输入到外存中时如果不加以转换的话就叫做二进制文件。
文本文件:如果在存入外存之前进行了转换,以ASCII码的方式进行存贮就叫做文本文件。
可以看下图。
3.流
程序在运行时会从外部设备获取信息,也会把数据输出到外部设备,而很明显,不同设备输入输出信息的方式是肯定不同的,所以就有了流这个概念,流就是负责连接程序和外部设备的东西,我们输入输出数据的时候都要把数据先放入流中,程序和外部设备再从流中读取数据,这样只要规定一下从流中读取和写入的方式就行了。
但我们在初学C语言时,直接可以从键盘上读取数据或者是直接将结果打印到屏幕上,而我们并没有打开什么流,这是为什么?
那是因为C语⾔程序在启动的时候,默认打开了3个流:一个是stdin(标准输入流),stdout(标准输出流),stderr(标准错误流)。
这三个流的类型是FILE*(也就是文件指针)。
4.文件指针
我们知道,每个文件都有一个独一无二的文件名,这样我们只要知道目标文件的名字就可以对目标文件进行操作。所以文件名一般都很长,但在C语言的程序中,我们在进行文件操作时并没有输入完整的文件名,而是通过文件指针就可以操作目标文件了。那么文件指针跟我们先前学习过的int*,char*一样都是存放的目标的位置信息吗?
可以告诉大家,不是。文件指针指向的是一个结构体,该结构体的名字是FILE,该结构体里面存放的是文件的相关信息,如文件的名字,状态和位置。通过文件信息区中存放的信息就可以找到目标文件,我们可以不用关注文件信息区里面存放的内容。下面就是三者之间的关系。
所以我们可以 通过文件指针来找到目标文件。
5.文件的打开和关闭
如果要对目标文件进行相关操作,那么程序开始时应该打开文件,程序结束时应该关闭文件。所以要先学习文件的打开和关闭函数。
FILE * fopen ( const char * filename, const char * mode );
其中filename表示的是目标文件的文件名,mode表示的是文件打开的方式。该函数的返回值是FILE*类型的,所以我们要用一个FILE*类型的变量来接收fopen函数的返回值。
int fclose(FILE *stream)
stream就是我们用来接收fopen函数返回值的指针变量 。
下图就是不同的打开方式
要注意,在使用fclose函数关闭文件后,该文件指针依然指向文件信息区,为了避免野指针的出现,所以在使用fclose函数后,应该再对该文件指针附上NULL。
下面是一个简单的用例
6.文件操作的其他函数
在学习了文件的打开和关闭后,我们就可以学习文件读写的函数了,要注意文件的读写函数分为两种,一种是随机读写,另一种是顺序读写。
(1)顺序读写的函数
(2)文件的随机读写
主要有三个函数
函数的用法可以在菜鸟教程的网站上学习
7.文件缓冲区
要注意我们通过键盘向文件中输入数据时,并不是我们输入一个系统就把数据放入文件中,而是先输入到缓冲区中,将缓冲区填满后,系统再把数据放入文件中,这样就可以提高运行效率,避免系统一直被打扰。因此,我们再操作文件时要刷新缓冲区或者在文件操作结束时关闭文件。