文件操作
- 打开方式介绍
- r+ / rb+模式
- w+ / wb+模式
打开方式介绍
函数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