从文件中删除记录?

时间:2010-08-31 10:51:31

标签: c file-io file

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

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

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

6 个答案:

答案 0 :(得分:7)

在数据中添加一列,表明它是有效(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

布兰达现已删除。

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

修改

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

我会告诉“罗伯特·巴恩斯”给出的类似解决方案。

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

  • 不需要额外的字节(没什么好处)

  • 数据确实已删除。当安全概念需要时,它非常有用。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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