我正面临逻辑构建问题。
假设我在txt文件中有以下数据:
David The Angel 20-04-2019 Bilal Learning how to read 20-04-2019 Sarah The subtitle art of not giving the <expletive deleted> 20-04-2019
现在我想将第二行的日期从20-04-2019更改为25-04-2019
我该怎么办?
答案 0 :(得分:1)
为了用长度S
的字节数组替换文件中位置E
(包括)到L
(不包括)的字节,需要考虑以下3种情况:
E - S == L
:最简单的情况是,文件大小不会更改。 seek至S
并写入L
字节。
// overwriting 4 bytes with 4 bytes
oooS---Eooo
oooLLLLEooo
E - S < L
:将更多内容写入文件,大小会增加。第一步,将以E
开头的每个字节移动到L - (E - S)
“再往后”。这样就有空间将L
字节写入S
,而不会覆盖E
处的字节(及其后的字节)。完成此“移动”后,请寻找S
并写入L
个字节。
// replacing 4 bytes with 6 bytes
oooS---Eooo
oooS---??Eooo
oooLLLLLLEooo
E - S > L
:更少地写入文件,尺寸减小。第一步,将以E
开头的每个字节移动到文件的“ (E - S) - L
之后”。这样可以减小S
和该字节在E
的新位置之间的空间,使其恰好为L
个字节。现在,更棘手的部分是:截断文件(记住,大小减小了!)。 C ++ 17文件系统TS为此使用了resize_file
,否则请使用a)一些库(boost?)b)依赖于平台的调用(在POSIX系统上为truncate
)。最后,将L
个字节写入S
。
// replacing 4 bytes with 2 bytes
oooS---Eooo
oooS-Eooo??
oooS-Eooo
oooLLEooo