有没有一种合适的方法可以用 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 呢?)。
如果原始字符串和替换字符串具有相同的 字节 长度(例如,aa
被 cc
替换,但未被 çà
替换),你可以就地更换。
如果文件很小(小于几千兆字节),您可以完全在堆内存中读取它(阅读 C dynamic memory allocation, use malloc
and free
), remove
原始文件,并从记忆中写入(例如使用 fwrite
或 fprintf
)新的。
在当前的笔记本电脑或台式机上,大多数文件都小到足以放入内存(例如,因为它们小于 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);
替换字符串...用他们的可能其他方式玩弄它
有没有办法用 C 中的另一个词替换文件中的字符串? 我意识到唯一(也许)可能的方法是通过适当的更改重写临时文件上的第一个文件。 问题是通过这样做我被迫对同一个文件进行读取和写入(它没有那么优化)。有没有办法在不创建新文件的情况下更改字符串?如果是,我该怎么做?
如果您将字符串 aa
替换为不同字节长度的字符串 bbb
(与 UTF-8 字符长度不同,请参阅 utf8everywhere),您需要一个临时文件,所以你暂时需要两倍的磁盘space。
顺便说一句,您可能需要指定 单词 到底是什么(想想单词是如何结束或分开的;combining characters 呢?)。
如果原始字符串和替换字符串具有相同的 字节 长度(例如,aa
被 cc
替换,但未被 çà
替换),你可以就地更换。
如果文件很小(小于几千兆字节),您可以完全在堆内存中读取它(阅读 C dynamic memory allocation, use malloc
and free
), remove
原始文件,并从记忆中写入(例如使用 fwrite
或 fprintf
)新的。
在当前的笔记本电脑或台式机上,大多数文件都小到足以放入内存(例如,因为它们小于 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);
替换字符串...用他们的可能其他方式玩弄它