C语言进阶指南(22)——文件管理函数

发布时间:2024年01月13日

欢迎来到博主的专栏——C语言进阶指南
博主id:代码小豪

一、文件输入输出函数

这些函数用于文件流,主要功能是将一连串的数据输出或输入,所以用于二进制文件远远多于文本文件(毕竟计算机的数据都是二进制表示的)。

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);//对所有的流进行输出
文章来源:https://blog.csdn.net/2301_77239666/article/details/135487770
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。