我想删除文件中的行。我知道您可以存储文件的内容(例如在向量中),擦除该行并再次写入。但是,如果文件变大,感觉很麻烦,效率也不高。
任何人都知道更好,更有效,更优雅的方式吗?
在大多数文件系统上,这是您唯一的选择,没有切换到实际的数据库。
但是,如果您发现自己处于这种情况(即非常大的文件,中间有插入/删除),请考虑您是否可以做一些事情,例如在文件顶部维护一个位图,其中每个位代表文件的一行. 要“删除”一行,只需翻转相应的位值。
磁盘文件没有什么特别神奇的地方。他们仍然喜欢将数据存储在连续的区域(通常称为“块”之类的东西)。他们没有办法在这些区域的中间留下无数据的漏洞。因此,如果您想从其中一个区域的中间“删除”三个字节,那么某处将不得不通过将该区域中的其他所有内容向后移动三个字节来完成此操作。不,它没有效率。
这就是为什么文本编辑器(必须经常做这种事情)倾向于将尽可能多的文件(如果不是全部)加载到 RAM 中,在 RAM 中移动数据要快得多。他们通常只在请求时(或定期)将更改写回磁盘。如果您将不得不进行很多这样的更改,我建议您从他们的书中获取一页并做类似的事情。
BerkeleyDB (dbopen(3)) 有一个名为 DB_RECNO 的访问方法。这允许使用任何类型的记录分隔符来操作具有任意长度的文件。默认使用带有 unix 换行符的可变长度记录作为分隔符。然后,您使用整数索引访问每个“记录”。使用它,您可以从文本文件中删除任意行。这不是特定于 C++ 的,但如果您使用的是大多数 Unix/Linux 系统,那么您已经可以使用此 API。