从文件中删除记录?

我正在使用文本文件来存储我的数据记录。 数据以下列格式存储。

 安东尼| 9876543210
阿扎尔| 9753186420
布兰达| 1234567890
大卫| 1357924680
约翰| 6767676767 

成千上万的记录存储在该文件中。 我想删除一个特定的记录,比如“David | 1357924680”。 我正在使用C,如何有效地删除特定记录? 目前我正在使用临时文件通过省略我想要删除的记录将记录复制到该临时文件。 复制到临时文件后,我通过截断原始文件的所有内容将临时文件的内容复制到原始文件。 我不认为我这样做有效。 帮我。

在数据中添加一列,表明它是有效(1)或删除(0)行:

Antony|9876543210|1 Azar|9753186420|1 Branda|1234567890|1 David|1357924680|1 John|6767676767|1 

如果要删除记录,请覆盖单个字节:

 Antony|9876543210|1 Azar|9753186420|1 Branda|1234567890|0 David|1357924680|1 John|6767676767|1 

布兰达现已删除。

然后添加一个数据文件压缩函数,该函数可用于重写除已删除行之外的文件。 这可以在低使用或无使用期间完成,因此它不会干扰常规操作。

编辑

有效性列可能应该是第一列,因此您可以更轻松地跳过已删除的行。

我认为你的方法有点不对劲。 如果你真的想有效地使用数据库,例如sqlite。 它是一个简单的文件中使用简单的数据库。 但它提供了很多sql的强大function,效率很高。 所以添加新条目和删除不会是一个问题(也很容易搜索)。 请查看: http : //www.sqlite.org/ 。 这是一个3分钟的教程,将通过示例解释如何完成您要在这里完成的所有事情: http : //www.sqlite.org/quickstart.html 。

一些提高效率的简单想法:

  • 您无法将临时文件复制回原始文件,但在将新文件重命名为原始文件后删除原始文件(假设它们位于同一个目录中)
  • 使用内存中的数据结构来复制文件而不是支持临时文件(但这样做可能会限制其大小并仅将其用作缓冲区)
  • 将某些记录标记为已删除但不将其从文件中删除,然后在执行一定量的删除操作后,您可以提供物理删除标记的记录(但您应该重写对该文件的其他操作以忽略标记的记录)

我会说一个类似的解决方案,“罗伯特S.巴恩斯”给出了。

我将David|1357924680修改为|--------------- (等量字节)。

  • 不需要额外的字节(没有多少好处)

  • 数据真的被删除了。 当安全概念需要时,它很有用。

稍后(每天,每周,……)做与现在相同/相似的事情。

三点建议:
1.按照您描述的方式执行,但不是将临时文件复制回原始文件,只需删除原始文件并重命名临时文件即可。 这应该快两倍。
2.使用’XXXXXXX’或其他任何内容覆盖记录。 这非常快,但可能不适合您的项目。
3.使用平衡二叉树。 这是’专业’的解决方案。 如果可能,请避免从头开始编程!

由于无法直接编辑文件,因此您必须使用类似于现在的方法。

正如其他人所提到的那样,保持适当的数据结构并且只是间隔回写会提高效率。