当前位置: 技术问答>linux和unix
fopen打开的文件,如何实现当文件达到一定大小后,重头进行覆盖写入
来源: 互联网 发布时间:2016-03-18
本文导语: 我的那个文件要求记录5000条记录,超过5000条时,重头开始写入,用新的记录覆盖掉旧的记录。fopen就那几种打开方式,我试了下,好像都不支持。如果以“a+“的方式打开,然后用lseek去定位,然后再写入也不行,...
我的那个文件要求记录5000条记录,超过5000条时,重头开始写入,用新的记录覆盖掉旧的记录。fopen就那几种打开方式,我试了下,好像都不支持。如果以“a+“的方式打开,然后用lseek去定位,然后再写入也不行,仍然会加到文件尾。各位有没有什么好的方法解决啊?由于操作原因,open方式打开文件暂不考虑,希望可以用fopen方式打开。
|
楼主的要求实现其来有点问题,如楼上所讲,用fopen,w+打开,fseek移动定位能部分实现你的功能,但有一点
,仔细想一下,你回到开头覆盖写后,你的意思是要一条记录覆盖一条记录,这时你就要保证你的记录长度一样才行,如果新记录比原记录长,覆盖时就会覆盖下一条记录的一部分的;如果短,那就出现原记录覆盖不全,会留一个尾巴的。
实际上,这种方法的实现,一般是用两个文件交叉覆盖比较好。过程是这样的:
设置两个文件a,b
a文件写满后,写b,b写满后,回过头来清掉a,重新写a.如此反复。
你另外置个标志,记录当前是写的那个文件,已经写了多少条了。加载数据的时候,根据情况分别从a,b读取不同的数据。
,仔细想一下,你回到开头覆盖写后,你的意思是要一条记录覆盖一条记录,这时你就要保证你的记录长度一样才行,如果新记录比原记录长,覆盖时就会覆盖下一条记录的一部分的;如果短,那就出现原记录覆盖不全,会留一个尾巴的。
实际上,这种方法的实现,一般是用两个文件交叉覆盖比较好。过程是这样的:
设置两个文件a,b
a文件写满后,写b,b写满后,回过头来清掉a,重新写a.如此反复。
你另外置个标志,记录当前是写的那个文件,已经写了多少条了。加载数据的时候,根据情况分别从a,b读取不同的数据。
|
第一次用r+打开
如果失败,表示文件不存在,再用w+打开
如果失败,表示文件不存在,再用w+打开
|
首先用r+打开.每次写完以后记录文件写的当前位置.当下次写的时候定位流到上次写的位置.
当写的行数>5000的时候就rewind.我试过了,用r+每次打开的时候不会删除原有的内容.
当写的行数>5000的时候就rewind.我试过了,用r+每次打开的时候不会删除原有的内容.
|
只有自己在程序中判断了,达到你要求的值时返回文件头。
但绝不能用a方式打开,a方式不管你当前文件指针在什么位置,在write()系统调用中会强置把文件指针置于文件尾,然后再写数据,即使多个进程写同一个文件它也会保证写在文件尾。
但绝不能用a方式打开,a方式不管你当前文件指针在什么位置,在write()系统调用中会强置把文件指针置于文件尾,然后再写数据,即使多个进程写同一个文件它也会保证写在文件尾。