有没有办法用 C 中的另一个单词替换文件中的字符串?我意识到唯一可能的方法(也许)是用适当的更改重写临时文件上的第一个文件。问题是,通过这样做,我被迫同时读取和写入同一个文件(它没有那么优化)。有没有办法在不创建新文件的情况下更改字符串?如果是,我该怎么做?
2 回答
如果将字符串替换为不同字节长度的aa
字符串bbb
(与 UTF-8 字符长度不同,请参见utf8everywhere),则需要有一个临时文件,因此您暂时需要两倍的磁盘空间。顺便说一句,您可能需要为您指定一个单词的确切含义(想想单词的结尾或分隔方式;组合字符呢?)。
如果原始字符串和替换字符串都具有相同的字节长度(例如aa
替换为cc
但不是替换çà
),您可以就地进行替换。
如果文件大小很小(小于几千兆字节),您可以完全在堆内存中读取它(阅读有关C 动态内存分配,使用malloc
and free
),remove
原始文件,并写入(例如使用fwrite
or fprintf
)新文件记忆。
在当前的笔记本电脑或台式机上,大多数文件都小到足以放入内存(例如,因为它们小于 1 GB),但并非全部。您可以在一些足够大的磁盘上拥有一个 TB 的文件(前提是您的磁盘分区和文件系统允许这样做)。
阅读有关 Cstdio
输入输出函数的更多信息。无法在文件“中间”或“内部”插入或删除字节,只能在文件末尾插入或删除。
如果文件是文本文件(不是二进制文件),您可以逐行读取它(如果有,请使用getline,或者仔细使用fgets并适当地处理行溢出)并循环处理每一行。然后,您可以假设每行都适合内存(例如,小于 1 GB)。
如果您需要能够处理包含单个 TB 行的大文件,您需要更多地考虑如何做到这一点(例如阅读有限状态机和/或以块的形式进行处理)。
如果这样的替换是您想要有效执行的常见操作,您可能会想到一些不同(并且更“有效”)的方式将数据保存在磁盘上,可能使用索引文件 à la gdbm或数据库à la sqlite。
是的,但您需要包含字符串标题...例如
#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);
替换字符串...玩弄它可能是其他方式