[C语言基础]文件读取模式简析

打开方式介绍

函数fopen可打开一个文件,返回值是文件指针FILE *
第一个参数是文件路径,第二个参数是打开方式mode
参数可为以下几种:
r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+
其中,
r 为只读,文件不存在会报错,不会覆盖文件,可以在文件任何位置读
w 为只写,文件不存在会创建,文件存在会覆盖之前的文件
a为追加,只能从文件末尾开始写
b为二进制读写,区别于文本模式

其余的mode均为组合模式,可以根据这三种展开理解。

主要理解方式是:
前面部分为master,后面部分为slave
比如r+模式,r为主要功能,那么它就不会覆盖文件,在不会覆盖文件的基础上,有写的功能,那么它就支持在文件任何位置插入而不会覆盖掉其他的部分

下面主要介绍r+/w+的特别用法

r+ / rb+模式

如前面所说,r+ 相比 r多的功能是写,但是写的前提是不会覆盖,在此基础上,支持写。
所以它支持在文件任何部分写入,并且不会覆盖掉原始文件。

比如二进制文件如下(128个字节的数据,每个字节为1,左侧红色框为偏移地址,不用考虑):
在这里插入图片描述
那么,如果想给它的第10~11字节改成0,其余部分保持不变,就可以使用rb+实现。

	char zero[2] = { 0 };
	FILE *f = fopen("test.bin", "rb+");
	fseek(f, 10, SEEK_SET);
	fwrite(zero, 1, 2, f);
	fclose(f);

执行完以上代码之后可以看到,其余部分不变,只有第10~11字节变成0了。
其实,文件用rb/rb+打开是可以代替追加a操作的,如果需要追加,可以fseek到文件末尾,再写入,原始文本文件是可以保留的。
在这里插入图片描述

w+ / wb+模式

w+比写多的功能是读,但是w是主要功能,所以它肯定会覆盖文件,不论什么文件用该模式打开都会清空,然后在写入的数据中支持读。
原始数据:
在这里插入图片描述

	char zero[2] = { 0 };
	FILE *f = fopen("test.bin", "wb+");
	fseek(f, 10, SEEK_SET);
	fwrite(zero, 1, 2, f);
	fclose(f);

执行完以上代码后,数据直接被覆盖掉了,但是它支持读,注意区分rb+,如果每次需要覆盖掉原来的文件,那么就要用w
在用fseek之后跳过的部分会用全零补充,因此会有12个0

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值