【问题标题】:Delete a record from a file?从文件中删除记录?
【发布时间】:2010-08-31 10:51:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: c file-io file


    【解决方案1】:

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

    Branda 现已被删除。

    然后添加一个数据文件压缩功能,可用于重写文件,不包括删除的行。这可以在使用率低或没有使用时完成,因此不会干扰常规操作。

    编辑

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

    【讨论】:

    • +1:如果文件已排序并且记录是固定大小的,那么遍历文件会更加高效,因为您可以进行二分查找。但很好的技巧。
    【解决方案2】:

    我认为你的方法有点错误。如果您真的想有效地使用数据库,例如 sqlite。在一个简单的文件中使用数据库很简单。但它提供了强大的 sql 功能并且非常高效。所以添加新条目和删除不会是一个问题(搜索也很容易)。所以检查一下:http://www.sqlite.org/。 这是一个 3 分钟的教程,它将通过示例解释如何在此处尝试完成的所有操作:http://www.sqlite.org/quickstart.html

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        • 数据确实被删除了。它在安全概念需要时很有用。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            正如少数其他人所提到的,保持适当的数据结构并仅在一定时间间隔回写会提高效率。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多