FILE 结构体
FILE 结构体是对缓冲区和文件读写状态的记录者,所有对文件的操作,都是通过FILE 结构体完成的。
typedef struct {
short level; /* 缓冲区满/空程度 */
unsigned flags; /* 文件状态标志 */
char fd; /* 文件描述符 */
unsigned char hold; /* 若无缓冲区不读取字符 */
short bsize; /* 缓冲区大小 */
unsigned char *buffer; /* 数据传送缓冲区位置 */
unsigned char *curp; /* 当前读写位置 */
unsigned istemp; /* 临时文件指示 */
short token; /* 用作无效检测 */
} FILE ; /* 结构体类型名 FILE */
当进行打开文件操作之后,我们打开的文件内容就会缓存到内存中,那么我们有一个疑问这里的FILE * 定义的pf是不是直接就指向这段缓冲了呢?那么FILE * 的结构体是什么呢?,我们接下来进行图解说明:
我们平时如果要看一个电影,如果内存只有1G那么我们可以观看超过1G大小的影片,这个观看是没有问题的。但是如果要把整个影片缓存到内存肯定是不够的,所以缓存是部分缓存。那么硬盘上也有缓冲,那就把已经缓存之后的执行完的数据放到硬盘缓冲区。
当我们把硬盘的内容缓存到内存的时候,我们需要记录什么时候缓存的部分执行完成之后将其放回硬盘缓冲区,内存缓冲区执行到了那个位置,缓冲区的大小,缓冲区有没有满/有没有空,等等很多信息我们都需要记录下来,所以当我们对于文件进行操作的时候,所以这些信息都要被记录下来,而记录者就是FILE *
所以当我们在打开文件到内存的时候,在背后系统为我们开了一个结构体,这个结构体就是记录当前文件的所有状态信息,也就是我们结构体中的所有内容。
通常在windows中我们将pf称为句柄:我们可以理解为资源的把柄,有了句柄我们就可以操作文件,也是文件的核心。所以并不是简单的pf指向内存的缓冲区。
fopen函数
要注意上面的file包括文件路径和文件名。
mode 详解:
文件读操作
我们来简单演示一下:
这个时候我们并没有创建出来ac.txt这个文件,但是我们给出了文件打开是否成功的判断结果,执行结果为:
我们可以看到文件打开失败。
那么如果我们创建一个ac.txt文件,那么就会打开成功。
那我们接下来进行的写入操作:
我们先介绍一个我们接下来有使用的一个函数:
参数说明:
我们通过上面函数进行编写:
执行结果为:
那么我们再来查看一下fputc的返回值:
我们可以看到fputc函数如果错误会返回error那么我们接下来进行测试:
我们通过上述方法验证没有写进去,执行结果为:
我们可以看到执行结果为 write error 所以在执行fputc的时候程序已经出错。
我们可以看到ac.txt里面是没有内容的,原因就是我们是以只读方式打开。
文件写操作
我们先开看一下当前目录并没有qw.txt 文件
接下来我们进行以下操作:
执行结果为:
我们可以看到创建了qw.txt文件并且写入成功。
那么如果文件存在呢?
接下来我们先给qw.txt写入一部分内容:
我们现在对于qw.txt还是以写入的方式打开,但是不写入任何内容。
执行结果为:
我们可以看到执行之后qw.txt里面没有任何数据,也就是将文件清空,那么文件可不可以读呢?这就不容易测出来,如果文件没有创建则里面是空的,如果有内容则会清空。我们通过一下方式进行测试:
执行结果为:
我们可以看到已经写入,但是如果我们再次进行操作的时候,是对于qw.txt的内容进行再次清空和写入。
我们进行以下操作:
我们加入一个rewind函数 它的功能就是让文件指针指向文件的开头,我们每一次在给文件进行写入操作的时候,写完之后都是把文件指针指向了文件的最后一个数据,所以这次当我们写完之后我们把文件指针调整到文件的开始位置:
接下来我们读取一个字节:
我们先来介绍一下fgetc函数的功能:
函数返回值:
有错误的时候返回EOF
所以我们进行错误判断的时候用一下形式:
执行结果为:
我们可以看到读失败。
filea 操作
执行结果为:
我们可以看到创建文件成功,里面之所以没有内容是因为我们没有写入数据。
我们先给xx.txt写入一部分内容:
我们写完之后再次执行程序则不会清空:
接下来我们需要再引入一个fputs函数,fputs函数的功能就是给文件写入一段数据。
我们通过fputs函数进行写入:
执行结果为:
我们可以看到执行成功并且在文件原有数据后面追加了数据hello world
那么写入没问题,我们进行读取:
执行结果为:
我们可以看到读取失败。
小结
r 以只读方式打开,如果文件不存在,则报错,文件不可写
w 如果文件不存在则创建文件,如果文件存在则清空。文件不可读
a 如果文件不存在则创建文件,文件存在,追加写,文件不可读。
r+ 可读可写
w+ 可读可写
a+ 可读可写
后面的+表示缺什么加什么
如果读写的是二进制文件,则还要加 b,比如 rb, r+b 等。 unix/linux 不区分文本和二进制文件。 文本文件和二进制文件都是二进制文件,但是windows里面编写会有所不同。那么在windows里面在进行二进制文件操作的时候就需要使用我们这里提到的用法