在C ++中从文件的特定位置替换元素

时间:2019-04-19 19:26:52

标签: c++ c++11 file-handling

我正面临逻辑构建问题。

假设我在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

我该怎么办?

1 个答案:

答案 0 :(得分:1)

为了用长度S的字节数组替换文件中位置E(包括)到L(不包括)的字节,需要考虑以下3种情况:

  • E - S == L:最简单的情况是,文件大小不会更改。 seekS并写入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