【问题标题】:Replacing element from a specific position at a file in c++从c ++中文件的特定位置替换元素
【发布时间】:2019-04-19 19:26:52
【问题描述】:

我正面临一个逻辑构建问题。

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

大卫天使 20-04-2019 Bilal 学习如何阅读 20-04-2019 莎拉 不给的字幕艺术 20-04-2019

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

我该怎么做?

【问题讨论】:

  • 你能展示你目前拥有的东西吗?
  • 您需要读取文件,更改您想要的行并将其写回。如果需要,您可以一次读取和写入 1 行。无需将整个文件保存在内存中。

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


【解决方案1】:

为了用长度为L的字节数组替换文件中从位置S(包括)到E(不包括)的字节,需要考虑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) 一些库(提升?) b) 平台相关调用(POSIX 系统上的 truncate)。最后,将L 字节写入S

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

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2018-05-06
    • 1970-01-01
    • 2016-10-29
    • 2021-10-28
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多