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

C++ 从c+;中文件的特定位置替换元素+;,c++,c++11,file-handling,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 比拉尔学习如何阅读2019年4月20日 莎拉的副标题艺术不给20-04-2019 现在我想把二线的日期从2019年4月20日改为20

我面临一个逻辑构建问题

假设我在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 比拉尔学习如何阅读2019年4月20日 莎拉的副标题艺术不给20-04-2019 现在我想把二线的日期从2019年4月20日改为2019年4月25日


如何操作?

要使用长度为
L
的字节数组替换文件中从位置
S
(包含)到
E
(排除)的字节,有3种可能的情况需要考虑:

  • E-S==L
    :简单的情况是,文件大小不变。到
    S
    并写入
    L
    字节

    // overwriting 4 bytes with 4 bytes
    oooS---Eooo
    oooLLLLEooo
    
    // replacing 4 bytes with 6 bytes
    oooS---Eooo
    oooS---??Eooo
    oooLLLLLLEooo
    
  • E-S
    :向文件中写入的内容越多,文件大小越大。作为第一步,将以
    E
    开头的每个字节通过
    L-(E-S)
    进一步向后移动。这样就可以将
    L
    字节写入
    S
    ,而不会覆盖
    E
    处的字节(以及以下字节)。一旦“移动”完成,寻找
    S
    并写入
    L
    字节

    // overwriting 4 bytes with 4 bytes
    oooS---Eooo
    oooLLLLEooo
    
    // replacing 4 bytes with 6 bytes
    oooS---Eooo
    oooS---??Eooo
    oooLLLLLLEooo
    
  • E-S>L
    :写入文件越少,文件大小越小。作为第一步,通过
    (E-S)-L将以
    E
    开头的每个字节“移动”到文件的“前面”。这减少了
    S
    E
    处字节的新位置之间的空间,使其正好
    L
    字节长。现在更棘手的部分是:截断文件(记住,大小减小了!)。C++17文件系统TS为此提供了支持,否则使用a)一些库(boost?)b)平台相关调用(
    truncate
    ,在POSIX系统上)。最后,将
    L
    字节写入
    S

    // replacing 4 bytes with 2 bytes
    oooS---Eooo
    oooS-Eooo??
    oooS-Eooo
    oooLLEooo
    

您能展示一下您目前拥有的吗?您需要读取文件,更改所需的行并将其写回。如果需要,您可以一次读写一行。不需要将整个文件存储在内存中。