在C ++中删除ofstream中的一行

时间:2011-05-27 15:42:34

标签: c++ fstream ofstream

我想删除文件中的行。我知道你可以存储文件的内容(例如在矢量中),擦除行并再次写入。但是,它感觉非常麻烦,如果文件变大则效率不高。

任何人都知道更好,更有效,更优雅的方式吗?

3 个答案:

答案 0 :(得分:7)

在大多数文件系统上,这是您唯一的选择,而不是切换到实际的数据库。

但是,如果您发现自己处于这种情况(即非常大的文件,中间插入/删除),请考虑是否可以执行类似于在文件顶部维护位图的操作,其中每个位代表一行你的文件。要“删除”一行,只需翻转相应的位值即可。

答案 1 :(得分:2)

磁盘文件没什么特别神奇的。他们仍然喜欢将数据存储在连续的区域(通常称为“块”)。他们没有办法在这些区域的中间留下无数据的漏洞。因此,如果你想从其中一个区域的中间“删除”三个字节,某个地方必须通过将该区域中的其他所有内容移回三个字节来完成此操作。不,它效率不高。

这就是为什么文本编辑器(必须经常做这类事情)倾向于将尽可能多的文件(如果不是全部)加载到RAM中,其中移动数据的速度要快得多。它们通常仅在请求时(或定期)将更改写回磁盘。如果你不得不做这样的很多改变,我建议从他们的书中拿一页并做类似的事情。

答案 2 :(得分:0)

BerkeleyDB(dbopen(3))有一个名为DB_RECNO的访问方法。这允许使用任何类型的记录分隔符来操纵任意长度的文件。默认情况下使用带有unix换行符的可变长度记录作为分隔符。然后使用整数索引访问每个“记录”。使用此方法,您可以删除文本文件中的任意行。这不是特定于C ++,但如果您使用的是大多数Unix / Linux系统,则此API已经可供您使用。