-2

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

4

2 回答 2

3

如果将字符串替换为不同字节长度的aa字符串bbb(与 UTF-8 字符长度不同,请参见utf8everywhere),则需要有一个临时文件,因此您暂时需要两倍的磁盘空间。顺便说一句,您可能需要为您指定一个单词的确切含义(想想单词的结尾或分隔方式;组合字符呢?)。

如果原始字符串和替换字符串都具有相同的字节长度(例如aa替换为cc但不是替换çà),您可以就地进行替换。

如果文件大小很小(小于几千兆字节),您可以完全在堆内存中读取它(阅读有关C 动态内存分配,使用mallocand free),remove原始文件,并写入(例如使用fwriteor fprintf)新文件记忆。

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

阅读有关 Cstdio 输入输出函数的更多信息。无法在文件“中间”或“内部”插入或删除字节,只能在文件末尾插入或删除。

如果文件是文本文件(不是二进制文件),您可以逐行读取它(如果有,请使用getline,或者仔细使用fgets并适当地处理行溢出)并循环处理每一行。然后,您可以假设每行都适合内存(例如,小于 1 GB)。

如果您需要能够处理包含单个 TB 行的大文件,您需要更多地考虑如何做到这一点(例如阅读有限状态机和/或以块的形式进行处理)。

如果这样的替换是您想要有效执行的常见操作,您可能会想到一些不同(并且更“有效”)的方式将数据保存在磁盘上,可能使用索引文件 à la gdbm或数据库à la sqlite

于 2018-02-10T08:24:16.603 回答
0

是的,但您需要包含字符串标题...例如

#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);

替换字符串...玩弄它可能是其他方式

于 2018-02-10T09:46:20.273 回答