欢迎来到博主的专栏——C语言进阶指南
博主id:代码小豪
文章目录
- 一、文件输入输出函数
- fwrite
- fread
- 二、文件定位函数
- 文件位置
- fseek
- ftell
- rewind
- 三、文件缓冲区
- fflush
一、文件输入输出函数
这些函数用于文件流,主要功能是将一连串的数据输出或输入,所以用于二进制文件远远多于文本文件(毕竟计算机的数据都是二进制表示的)。
fwrite
fwrite的作用就将连续的数据(数组),输出到文件流中
fwrite的函数原型有四个参数
buffer是一个void的指针,实际应用时可以是任何一个可使用内存区域。
size是确定一个待上传的元素的大小,单位是字节。
count是确定这种元素(size字节的元素)有多少个。 stream是一个FILE的指针,是一个已经打开的文件输入流。
fwrite的返回值是成功输出的元素个数。比如我指定输出的元素个数为5(count=5),但是实际输出了3个元素之后就发生错误了,那么此时函数的返回值是小于5的。
以下面代码为例,使用fwrite将一个int类型的数组输出至文件“data.bin”中(txt是文本文件的后缀名)
FILE* pf = fopen("data.bin", "wb");//打开二进制文件的文件输出流
//模式应该为"wb"
int ret=fwrite(arr, sizeof(arr), 1, pf);
if (ret != 1)//判断输出数据是否成功
{
perror("fwrite happen error");
fclose(pf);
exit(EXIT_FAILURE);
}
fclose(pf);
return 0;
windows中的二进制文件是不能直接打开的,可以在打开方式中选择记事本打开。可以发现二进制文件难以用文本的形式读取。
但是使用vs可以查看二进制文件,将文件作为现有项添加进源文件中。双击查看二进制文件
fread
fread函数可以从文件输入流读取数据,通常读取的都是二进制文件的文本流。
fread函数原型有4个参数
buffer是一个void*的指针,是数据输入的目的地。
size是元素的大小
count是元素个数
stream是一个已经打开的文件输入流
以刚刚生成的data.txt文件为例。将里面的数据输入至一个int类型的数组中。
代码如下:
int arr[10] = { 0 };
FILE* pf = fopen("data.bin", "rb");//打开二进制文件的文件输入流
//二进制文件的输入流的模式是"rb"
int ret=fread(arr, sizeof(arr), 1, pf);
if (ret != 1)
{
perror("fread happend error");
fclose(pf);
exit(EXIT_FAILURE);
}
fclose(pf);
二、文件定位函数
文件位置
文件流有文件位置,打开文件时,会将文件位置设置在文件的起始处(追加状态下,会将文件位置设置在末尾处)。随着对流的读取或者写入操作,文件位置会向后推动。
但是并非所有数据都是顺序读写的,某些程序需要具备在文件中跳跃式读写的能力。即可以在一处地方读写数据,再去另一处读写数据。
<stdio.h>包含了一部分修改文件位置的函数
fseek
fseek的函数原型有三个参数
stream是一个流,是待改变文件位置的那个流
offset是偏移量,即文件目标位置相对于指定位置的偏移字节数(为负往左偏移,为正往右偏移)
origin是指定位置。<stdio.h>规定了三个宏来作为这个参数的值
(1)SEEK_SET 文件的起始处
(2)SEEK_CUR 文件的当前位置
(3)SEEK_END 文件的末尾处
比如要将已经运行的文件位置调整为起始处
FILE*pf=fopen("data.txt", "w");
…………………………
fseek(pf, 0L, SEEK_SET);//设置在文件起始处
//偏移量为0的文件位置
将文件位置调整为末尾处
fseek(pf, 0L, SEEK_END);
当然,也可以调整到任意一个位置,只要设计好偏移量和指定位置即可。
ftell
stream是需返回文件位置的文件
ftell以长整型返回当前的文件位置。由此可以使用ftell来提供给fseek函数作为参数调整文件位置
long f_pos = ftell(pf);
{
//其他程序
}
fseek(pf, f_pos, SEEK_SET);
这样子就可以回到原先的当前文件位置
rewind
rewind函数会使文件位置回到起始处。
rewind(pf);
几乎等价于
fseek(pf,0L,SEEK_SET);
三、文件缓冲区
操作系统向磁盘输入数据和从磁盘读入数据都是比较慢的操作,如果每一次对磁盘的输入\输出都是直接访问的话,会对计算机的运行速度造成较大的影响。
因此使用文件缓冲的形式可以提升数据的读写速度。
将输出的数据存储在内存的缓冲区内,当缓冲区满了(或者一些操作)是,将缓冲区中的数据一次性输出至设备中)
输入的数据以相反的方式进行缓冲
当程序向文件中读取或写入数据时,数据先放入缓冲区中,当缓冲区满了或者关闭文件流时,缓冲区会将数据进行相应的“输出”。
如果想要提前将缓冲区的数据进行读写,可以使用fflush函数
fflush
使用fflush函数,可以使程序以我们所设定的频率使缓冲区中的数据进行输出
fflush(pf);//使pf相关联的缓冲区进行输出
fflush(NULL);//对所有的流进行输出