C++ 从c+;中文件的特定位置替换元素+;
我面临一个逻辑构建问题 假设我在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日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
如何操作?要使用长度为
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
字节长。现在更棘手的部分是:截断文件(记住,大小减小了!)。C++17文件系统TS为此提供了支持,否则使用a)一些库(boost?)b)平台相关调用(L
,在POSIX系统上)。最后,将truncate
字节写入L
S
// replacing 4 bytes with 2 bytes oooS---Eooo oooS-Eooo?? oooS-Eooo oooLLEooo