我们知道程序中的数据是在内存中进行存储的,当程序关闭的时候,这些数据也就被销毁,而在某些情况下我们可能需要将数据记录下来,那么此时数据就需要存储在文件中,关于文件,内容如下:
目录
1.什么是文件
打开你电脑的任意一个磁盘,你会看到磁盘中存储着许多的东西,这些就是文件,数据存放在文件中可以进行长久的保存
2.文件的分类
文件按照功能来分类可以分为数据文件和程序文件
程序文件包括目标文件(windows环境下后缀为.obj),可执行程序(windows环境下后缀为.exe)等
数据文件是程序运行时读取的数据
根据数据的组织形式来分类的话可以分为二进制文件和文本文件
二进制文件是以二进制的形式进行存储的文件,文本文件是以ASCII字符形式存储的文件
3.文件的打开和关闭
在介绍相关的文件操作函数前先介绍几个重要的概念
3.1文件名
为方便用户识别和使用,每一个文件都要有一个唯一的文件标识,文件标识包含3个部分:
文件路径+文件名主干+文件后缀
一般我们所说的文件名就是文件标识
3.2文件指针
每个被使用的文件都会在内存中开辟一个相应的文件信息区,用来存放文件的相关信息,如文件的名字,文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的,这个结构体类型由系统声明,取名为FILE
我们就是通过FILE类型的指针(即文件指针)找到对应的文件并对该文件进行维护
3.3打开文件
打开文件需要使用的函数:fopen
filename:文件名,写文件名路径记得写“\\”,单个“\”程序会误以为是转义字符,路径如果不写的话默认是程序所在路径
mode:以什么方式打开,常见打开方式如下:
"r"(只读) 读取文件的数据,若文件不存在返回空指针
"w"(只写)
打开一个空文件写入数据,若打开的文件有内容,内容会被销毁,文件不存在则新建文件
"a"(只写)
打开一个文件,向末尾追加数据,文件不存在则新建文件
"r+"(读/写)
打开文件进行读写操作,该文件必须存在,不存在返回空指针
"w+" (读/写)
创建一个空文件进行读写,如果文件已经存在,文件内容进行销毁
"a+"(读/写)
打开文件,在末尾进行读写操作,文件不存在则新建文件
其它的像"rb"、"rb+"等是类似的,不同的是表中打开的是文本文件,而类似"rb"这些打开的是二进制文件,注意这些都是双引号进行引用
3.4关闭文件
函数:fclose
记得关闭文件后将指针改为NULL
4.文件读写
在介绍文件读写前依旧是有一个概念需要补充
4.1流
流是数据和程序之间的交互形式,我们在运行C语言程序的时候会默认打开三个流:
stdin:标准输入流
stdout:标准输出流
stderr:标准错误流
所以数据一般是从键盘输入,在显示器上进行输出
4.2文件顺序读写
之所以叫顺序读写是因为这些函数是按照前后顺序来对文件进行操作,每次进行读取或写入,文件指针就会后移一位
函数如下表:
fgetc | 字符输入函数 | 适用于所有流 |
fputc | 字符输出函数 | 适用于所有流 |
fgets | 文本行输入函数 | 适用于所有流 |
fputs | 文本行输出函数 | 适用于所有流 |
fscanf | 格式化输入函数 | 适用于所有流 |
fprintf | 格式化输出函数 | 适用于所有流 |
fread | 二进制输入 | 适用于文件 |
fwrite | 二进制输出 | 适用于文件 |
下面逐个进行介绍
4.2.1 fgetc/fputc
二者的函数声明如下:
fgetc就是从文件中读取一个字符, 参数写文件名即可,当文件读取结束的时候返回EOF,fputc中有一个参数是int是因为文本文件是以ASCII字符形式存储,在使用时可以直接写字符
4.2.2 fgets/fputs
string:接收读取出来的字符串
n:读取的数据的最大个数
文件读取结束返回NULL
string:接收输出的字符串
需要注意的是,这两个函数一次只能对文件的一行进行操作
4.2.3 fscanf/fprintf
这两个函数的操作和scanf/printf类似,区别在于第一个参数是FILE*stream,fscanf中是从stream中读取数据,fprintf是将数据输出到stream
4.2.4 fread/fwrite
buffer:接收读取的数据
size:单个数据的大小
count:读取的数据的个数
函数的返回值是实际读取到的数据的个数
buffer:接收数据
size:单个数据的大小
count: 写入的数据的个数
4.3文件的随机读写
4.3.1 fseek
这个函数可以让文件指针指向文件的任意位置
offset:偏移量,正数是向后偏移,负数是向前偏移
origin:起始位置,有三种选项:SEEK_CUR(当前位置为起点)、SEEK_END(文件末尾)、SEEK_SET(文件起始位置)
假设有一个文件,文件中的内容是“abcdef”,文件指针指向字符a
fseek函数选择偏移量为3,以当前位置为起点,那么文件指针就到了字符d的位置
4.3.2 ftell
此函数是用于查看文件指针相对于文件起始位置的偏移量
4.3.3 rewind
让文件指针回到文件起始位置
5.文件缓冲区
ANSIC采用“缓冲文件系统”来处理数据文件
缓冲文件系统:系统会自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上,如图:
而这一安排的原因也很简单,我们的操作系统同时运行着多个程序,如果操作系统频繁的被某个程序调用,那么其它程序就无法正常的运行
不过也不是说一定要等到缓冲区满后才能调用操作系统,有时也可以强行调用操作系统,比如换行符,换行符可以刷新缓冲区,那么缓冲区中的数据就会被操作系统送走
关于文件的操作就到这,完