有没有一种合适的方法可以用 C 中的另一个词替换文件中的字符串?

Is there a decent way to replace a string within a file with another word in C?

有没有办法用 C 中的另一个词替换文件中的字符串? 我意识到唯一(也许)可能的方法是通过适当的更改重写临时文件上的第一个文件。 问题是通过这样做我被迫对同一个文件进行读取和写入(它没有那么优化)。有没有办法在不创建新文件的情况下更改字符串?如果是,我该怎么做?

如果您将字符串 aa 替换为不同字节长度的字符串 bbb(与 UTF-8 字符长度不同,请参阅 utf8everywhere),您需要一个临时文件,所以你暂时需要两倍的磁盘space。 顺便说一句,您可能需要指定 单词 到底是什么(想想单词是如何结束或分开的;combining characters 呢?)。

如果原始字符串和替换字符串具有相同的 字节 长度(例如,aacc 替换,但未被 çà 替换),你可以就地更换。

如果文件很小(小于几千兆字节),您可以完全在堆内存中读取它(阅读 C dynamic memory allocation, use malloc and free), remove 原始文件,并从记忆中写入(例如使用 fwritefprintf)新的。

在当前的笔记本电脑或台式机上,大多数文件都小到足以放入内存(例如,因为它们小于 1 GB),但并非全部。您可以在足够大的磁盘上拥有一个 TB 的文件(前提是您的磁盘分区和文件系统允许)。

阅读有关 C 的更多信息 stdio input output functions。无法插入或删除字节 "in the middle of" 或 "inside" 文件,只能在文件末尾插入或删除字节。

如果文件是文本文件(不是二进制文件),您可以逐行读取它(使用 getline if you have it, or else carefully using fgets 并适当处理行溢出)并循环处理每一行。然后您可以假设每一行都适合内存(例如小于 1 GB)。

如果您需要能够处理包含单个 TB 行的巨大文件,您需要更多地考虑如何做到这一点(例如,阅读 finite state machines and/or 做你的处理成块)。

如果此类替换是您想要高效执行的常见操作,您可能会想到一些不同的(以及更多 "efficient")将数据保存在磁盘上的方法,也许使用索引文件 à la gdbm, or databases à la sqlite.

是,但您需要包含字符串 header...例如

#include <iostream>
#include <string>

int main()
{
  string proverb {"A nod is as good as a wink to a blind horse"};
  string sentence {"It's bath time!"};    // lol
  proverb.replace(38, 5, sentence, 5, 3);
 ......etc

用蝙蝠代替马 或

proverb.replace(0, 43, sentence, 0, 15);

替换字符串...用他们的可能其他方式玩弄它