我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了。如果想要把数据进行持久化的保存,我们可以使用文件。
目录
文件的分类
文件被分为程序文件和数据文件两种。
程序文件:源程序文件,可执行程序文件等。
数据文件:存放数据的文件,程序运行时读写的数据。
数据文件又可以被分为两种二进制文件和文本文件。
- 二进制文件:数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件件中。
- 文本文件:以ASCII字符的形式存储的文件就是文本文件。
流和标准流
流(stream)
主要用于输入输出操作,是程序与外部世界进行数据交换的通道或桥梁。“流”既可以是从源(如键盘、磁盘文件)向目标(例如屏幕、内存缓冲区等)流动的数据集合,也可以反过来表示。
标准流
• stdin - 标准输入流,在大多数的环境中从键盘输入。
• stdout - 标准输出流,大多数的环境中输出至显示器界面。
• stderr - 标准错误流,大多数环境中输出到显示器界面。
这三个流是默认打开的,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
文件指针
每个被使用的文件都在内存中开辟一个相应的文件信息区。用来存放文件的相关信息(如文件的名字,文件状态等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名 FILE。
例如,VS2013 编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息。一般都是通过一个FILE的指针来维护这个FILE结构的变量。我们可以创建一个FILE*的变量。
通过pf即文件指针变量能够间接找到与它关联的文件。
文件打开和关闭
文件的打开和关闭是依靠fopen和fclose函数来实现的。
- filename:文件名。
- mode:文件的打开方式。
- stream:流。
- fopen返回值:成功打开后返回此文件信息区的起始地址,打开失败则返回一个NULL。
- fclose返回值:如果关闭成功就返回0值,否则返回EOF(-1)值。
以下为几种文件打开方式:
文本文件:
二进制文件:
注:当使用“w”,“wb”,“w+”,“wb+”打开文件时会清除文件原本存储的数据。
举例:
文件顺序读写
以下为顺序读写函数:
我只介绍部分函数的用法,剩下的可以去https://cplusplus.com/上学习。
fputc
- character:接收所要存入的字符的ASCII值。
- stream:流(接收指向所要存入文件的指针)。
fgetc
- stream:流(接收指向所要读取文件的指针)。
- 读取正常返回读取的ASCII码值,如果读取结束或失败返回EOF。
文件的随机读写
以下为随机读写函数:
要事先存入一些数据,我存的是"abcdef"。
fseek
- offsrt:传入指针所要偏移的偏移量。
- origin:设置传入的stream指针的起始位置(可传入3种模式)。
- 该函数运行成功返回零。否则回非零值。
举例:
文件指针的位置原来是在a的,向后移1位就到了b,利用fgetc得到b,文件指针的位置会自动移到c。
ftell
举例:
rewind
举例:
文件读取结束的判定
以下为文件读取结束的判定函数:
文本文件读取结束条件
—判断返回值是否为EOF或NULL
例:
fgetc:判断返回值是否为EOF。
fgets:判断返回值是否为NULL。
二进制文件读取结束条件
—判断返回值是否小于实际要读的个数
例:
fread:判断返回值是否小于实际要读的个数。
要事先存入一些数据,我存的是"abcdef"。
- 如果遇到文件末尾返回非0的数,否则返回0。
- 如果文件读取发生错误返回非0的数,否则返回0。
举例:
好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈,如果觉得不错那就点点赞吧!