文件存在的意义主要是保存数据。因为我们写的程序数据是存储在电脑内存中的,如果内存回收,数据就丢失了。因此我们想要将数据给永久保存,我们就可以使用文件。
文件一般分为两种:
程序文件
程序文件包含源程序文件(后缀为.c),目标文件(windows环境下后缀为.obj/Linux环境下后缀为.o),可执行程序(windows环境下后缀为.exe/Linux环境下一般没有后缀)。
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
文件名
文件名包含三个部分:文件路径+文件名主干+文件后缀
流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念。
标准流
我们引入3个标准流的概念。
stdin-标准输入流
stdout-标准输出流
stderr-标准错误流
因此我们使用scanf,printf等函数就可以直接进行输入输出的操作。
文件指针
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息。
这些信息是保存在一个结构体变量中的,我们给这个结构体类型系统命名了,取名FILE。
因此我们常常构建FILE*的文件指针。
文件的使用方式
打开文件:fopen
关闭文件:fclose
"r"---只读文件(如果文件不存在,将报错)
"w"---只写文件(如果文件不存在,将建立一个新的文件)
"a"---追加(如果文件不存在,将建立一个新的文件)
"rb"---与“r”不同的是,“rb”是打开一个二进制文件
"wb"---与“w”不同的是,“wb”是打开一个二进制文件
“ab”---与“a”不同的是,“ab”是打开一个二进制文件
文件的顺序读写
顺序读写函数:
fgetc , fputc , fgets , fputs , fscanf , fprintf , fread , fwrite
fgetc 是在文件里输入一个字符
格式如下:
fgets 是将文件里的一个字符串输入出来放在一个数组里
格式如下:
fputc 是输出文件里一个字符
fputs 是输出文件里一个字符串
格式如下:
fscanf 是格式化输入一个文件里内容,可将其输入至另一个文件中
fprintf 是格式化输出一个文件里的内容
fread 是二进制输入一个文件里内容,可将其输入至另一个文件中
格式如下:
将文件中的内容放置于arr数组中,并限制放入的大小为7个int类型的大小。
fwrite 是二进制输出一个文件里的内容
格式如下:
将arr数组中的内容放到文件中打印出来,限制打印的数量为7个int整型的大小。
接下来,我们来对比一组函数
scanf / fscanf / sscanf
scanf 就是常用的输入函数
fscanf 是格式化输入一个文件里内容,可将其输入至另一个文件中
那么sscanf是什么呢?
sscanf 是将文件中的内容以一个字符串的形式打印出来,通常在使用这个函数时,我们会创建一个数组来存放数组串
举个例子:
对比看一下,fscanf在scanf的基础上多出来一个文件指针。sscanf在scanf的基础上多出来个字符指针。
printf / fprintf / sprintf
printf 就是常用的输出函数
fprintf 是格式化输出一个文件里的内容
sprintf 是以字符串的形式将文件里的内容给打印出来,同样,我们常用数组来存放字符串,再讲数组给打印出来
举个例子:
对比看一下,fprintf在printf的基础上多出来一个文件指针。sprintf在printf的基础上多出来个字符指针。
接着,我们来介绍文件随机读写的几个函数
文件的随机读写
fseek
根据文件指针的位置和偏移量来定位文件指针
格式如下:
ftell
返回文件指针相对于起始位置的偏移量
格式如下:
rewind
让文件指针的位置回到文件的起始位置
格式如下:
feof
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文尾结束。
注意几个点
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
fread判断返回值是否小于实际要读的个数