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

Replacing element from a specific position at a file in c++

本文关键字:位置 定位 元素 文件 c++ 替换      更新时间:2023-10-16

我面临着逻辑构建问题。

假设我在 txt 文件中有以下数据:

大卫天使 20-04-2019 比拉尔学习如何阅读 20-04-2019 莎拉 不给<咒骂删除>的字幕艺术

20-04-2019现在我想将第二行的日期从 20-04-2019 更改为 25-04-2019

我该怎么做?

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

  • E - S == L:简单的情况,文件大小不会改变。 寻求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