引言:本篇文章主要的内容是关于c语言文件相关的知识点,包括相应的代码实操,及文件操作时常用的接口讲解。
本篇文章用来解决如何将内存中的数据永久保存到磁盘当中,并且如何从磁盘读取内容放到我们内存当中。
我将讲解如下知识点:
1:文件(是什么,为什么要用,)
2:常用接口的介绍(顺序读写)
3:文本文件与二进制文件的介绍
4:文件的缓冲区
本文正式开始
1:文件
什么是文件:我们可以简单理解为磁盘上的文件就是文件,但是在我们程序设计当中文件按其功能可以分为:程序文件,数据文件。
程序文件:程序在编译与链接过程中所生成的文件(.c,.obj,.exe)。
数据文件:文件的内容不一定时程序,是用来与我们程序运行时读写的文件。
文件名:每一个文件的唯一标识符,通常包含三个部分:文件路径+文件名主干+文件后缀。
为什么要用文件:
我们知道数据在内存中存储的时候,是暂时存储的当我们的程序结束后数据就会被释放,而当我们每次启动程序的时候这些数据才会被加载到内存中,所以为了永久的保存数据我们需要将程序需要保存的内容写入到磁盘当中,并用相应的文件来保存这些数据,这样我们就既可以从文件中读取上次保存的数据,又可以给文件中写入我们需要保存的数据。所以我们需要使用文件。
2:常用的接口介绍:
首先我们先来提前了解一个默认知识:每一个文件被打开的时候,都会在内存中申请一块空间,这块空间的名字叫做文件信息区,我们可以简单的理解这个文件信息区会保存当前文件的内容,大小等等关于这个文件的。
对文件操作时固定的步骤:1:打开文件 2:读写文件 3:关闭文件
打开文件接口: fopen
fopen(“打开的文件名”,“以什么方式打开") 注意:两个都是字符串指针类型(const char*)
返回值:FILE*指针,这个指针是指向我们打开这个文件在内存中的文件信息区。
打开文件的形式:
本章我们主要研究: ”r“与”w“。
"r":读文件,可以使用相对或绝对路径来填写文件名,如果没有该文件,那么程序就会报错。
"w": 写文件,如果该文件不存在那么会自动生成该文件,可以建立一个新文件,相当于重写文件.
fclose:关闭文件:本质上就是将我们内存中的文件信息区给释放,使用后已将文件指针置空。
成功返回0,不成功返回EOF
下面我们就用程序来操作文件。
刚开始在该目录下没有任何其他文件
我们使用读文件的方式:假设读取文件名为”data.txt“
我们以写的方式打开:
程序正常运行并且没有文件也会为我们创建一个文件。
现在我们已经会打开文件和关闭文件了,接下来我们就应该学习对文件进行读写了。
顺序读写(fputc,fgetc,fputs,fgets,fscanf,fprintf)
写:fputc,fputs,fprintf
读:fgetc,fgets,fscanf
fputc:向文件中写入一个字符
fputs:向文件写入字符串
fprintf:向文件写入格式化的形式 这几个函数适用于所有输出流。
写:fgetc,fgets,fscanf
fputc:向文件中读取一个字符
fputs:向文件读取字符串
fprintf:向文件读取格式化的形式 这几个函数适用于所有输入流。
下面我们来演示上面的功能
向文件中写入26个字符
接下来我们换做读取
或读取我们写的程序文件
fgets与fputs的内容只是以读写字符串的形式进行的。
同样的fgets读取文件并且存放到一个字符数组中去。
fgets读num-1个字符到str里面去,并且最后一个默认给'\0'字符串标识符号
下面我们来学另外两个接口函数(fprintf,fscanf);
假设我们要向文件中写入10000个数我们就可以使用fprintf这个接口了,以格式化的方式写入。
可以自己选择以什么样的方式进行写入。
fscanf读取需要自己定义变量保存下来。
以二进制的方式写文件和读文件的两个接口:fwrite,fread顾名思义写和读,并且打开文件的方式分别为: “wb” "rb"
fread:以二进制的形式读取文件
以二进制写文件,那么我们读取的时候就要以二进制读的方式。
3:文本文件与二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
二进制文件:数据在内存中以二进制进行存储的,如果我们不加转化的直接写入到我们的磁盘文件当中,这样的文件就叫做二进制文件。
文本文件:将在内存中的二进制文件加以转化成ASCII码字符的形式在外存中进行存储的方式就叫做文本文件。
数据存储的差异:比如说我们要存储一个整形a=10000那么如果我们使用二进制文件进行存储的话大小就只要占4个字节,而ASCII码会将这个数据a看作由5个字符构成的 '1' '0' '0' '0' '0'这5个字符。
我们可以在vs下看到这个文件的二进制内容,右键test.txt-->选择打开方式-->二进制编辑器
4:文件的缓冲区
是什么:其实文件缓冲区的本质就是在内存中申请的空间,有输入缓冲区与输出缓冲区,方便我们的磁盘与内存相互交互。
为什么:我们的内存写入或读取数据并不是直接向硬盘当中读或写,而是会先将我们的数据加载到输入缓冲区或输出缓冲区,这样能够保证内存与硬盘读写时的效率。
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件(本质也会刷新我们的缓冲区)。 如果不做,可能导致读写文件数据丢失的问题。