一、文件存在的意义
文件存储在硬盘上,其存在的意义是将数据持久化地保存(一般的数据存放在内存中)
二、文件的分类
2.1 程序文件
包括源程序文件(.c),目标文件(.obj),可执行文件(.exe)。
2.2 数据文件(文章介绍主要内容)
为程序运行时,进行读或写操作的文件。
三、数据文件的两种形式
3.1二进制文件
数据在内存中是以二进制形式存储的,若是不加转换地存储到文件当中,就会形成二进制文件。
3.2文本文件
若将内存中二进制形式存储的数据利用ASCII码进行转换,完毕后存储,就会形成文本文件。
四、文件的操作前提:打开和关闭文件
4.1文件的打开
使用函数:
FILE* fopen(const char* filename,const char* mode);
其中filename就是想要打开/新建的文件路径,若是直接在当前目录下进行文件操作可以直接写文件名;
mode是从几类固定格式中进行选择,来达到希望进行的操作,例如“r”为文本文件只读,“w”为文本文件只写,“rb”为二进制文件只读等等,详情可参考fopen - C++ Reference (cplusplus.com)
4.2文件的关闭
使用函数
int fclose ( FILE * stream );
其中stream是打开文件的时候,用于接受fopen返回值的变量
4.3流和标准流
4.3.1 流
由于不同的外部设备有着不同的输入/输出操作,为此我们假定流的概念,来方便操作。
规定统一向流中写入数据,或从流中读取数据。
4.3.2 标准流
C语言在书写#include<stdio>的时候,默认为我们打开了三个标准流
他们是:stdin标准输入流,stdout标准输出流,stderr标准错误流。
而scanf就是从标准输入流中读取数据。
printf是将数据输出到标准输出流中。
4.4文件指针
每一个被使用的文件都会在内存中开辟出相应的文件信息区用来存放文件信息,该区本质上是一个结构体变量,结构体类型为系统命名FILE。
因此,FILE*即文件指针类型,可以作为桥梁连接程序与文件。
五、文件的顺序读写函数
5.1 fputc与fgetc
可作用于所有输入/出流,为字符输入/出函数,单次写入一个字符
5.2 fputs与fgets
可作用于所有输入/出流,为文本输入/出函数,单词写入一行文本
5.3 fprintf与fscanf
可作用于所有输入/出流,为格式化输入/出函数,可实现将类似结构体等格式化数据放入文件中
5.4 fwrite与fread
可作用于文件输入/出流,可以自行决定写入/读出的元素大小和个数
六、文件的随机读写函数
6.1 fseek函数
如下:
int fseek ( FILE * stream, long int offset, int origin );
其中,stream为文件指针变量,指向所操作的文件
offset为偏移量,可以为负数
origin为固定格式的枚举常量,使用时选择合适的枚举名即可,其意义是起始位置,SEEK_SET为文件开头,SEEK_CUR为文件指针(光标)当前位置,SEEK_END为文件末尾
函数整体用来读取文件内容。
6.2 ftell函数
long int ftell ( FILE * stream );
用于返回光标相对起始位置的偏移量
6.3 rewind函数
void rewind ( FILE * stream );
用于下达指令让文件指针位置返回到起始位置
七、文件读取结束的判定
7.1判断文本文件是否读取结束
①判断fgetc返回值是否为EOF
②判断fgets返回值是否为NULL
7.2判断二进制位见是否读取结束
看fread返回值是否小于实际要读的个数