最近做了一些文件处理的东西,发现fopen的打开属性不同会有很大的问题,如果不认识这些而凭感觉去写代码会有很大的问题。
首先说一些fopen的打开方式:
r:打开文本文件,只能读,不能创建文件
r+:打开文本文件,能读能写,不能创建文件,不清空文件
w::打开文本文件,只能写,可以创建文件,清空文件
w+:打开文本文件,能读能写,可以创建文件,清空文件
a:打开文本文件,能读能写,可以创建文件,不清空文件(原EOF符不保留)
a+:打开文本文件,能读能写,可以创建文件,不清空文件(原EOF符保留)
在中间加"b"就是打开二进制文件,其他都一样,这个不是本文主要要说的问题。
以前给文件写内容一般都是用的“wb+",如果要保留原来的文件内容一般都用的是"ab+",所以以后都是用的这一个思路,写新文件都用"wb+",增加内容就用"ab+"。
但是最近要做一个设计,要求是修改文件当中的某一个部分,这个由于要保留一部分原文件内容,所以就用了"ab+",但是这个时候就发现了一个问题,无论我fseek到哪个位置,我fwrite的内容都是放在了文件的末尾,这个就明显不符合设计的要求。
我以为这样了要实现这个目的只能通过写缓存文件了,先把原文件内容备份到缓存文件里面,然后再用"wb+"去写原文件,然后到了写修改的内容的时候再把我修改的内容写进去,这是一个“笨”方法,但是当时我确实是想到了用这个方法。
后来我想了一下,看看"rb+"能不能写文件吧,结果发现这个是可以写文件的,而且不是用的追加方式,也不会清空文件,正是我要用的参数。
所以最后我就总结了一下文件操作的参数设置
如果想新建文件,就用w(+)
如果想增加内容,就用a(+)
如果想修改内容,就用r+