【问题标题】:Delete record from file C++从文件 C++ 中删除记录
【发布时间】:2012-05-17 10:24:28
【问题描述】:

我正在使用 C++ 开发一个简单的数据库控制台应用程序,用于在 .dat 文件中添加、编辑和删除记录。我已经添加和修改了,我只是发现在这种情况下很难理解删除的概念。下面是我写记录的方法。

写记录

fh.seekp(num*sizeof(customerObj),ios::beg); // Move the write pointer to where rec is
fh.write((char*)&customerObj,sizeof(customerObj)); // Write updated rec

任何想法如何代替write() 我可以拥有与delete() 等效的东西...或者它不是那么简单吗?

【问题讨论】:

    标签: c++ file-io record file-pointer delete-record


    【解决方案1】:

    C 和 C++ 没有删除部分文件的功能。许多操作系统也没有。

    可能的选择:

    1. 如果这是最后一条记录,则截断文件。如果不是,则移动(=复制)其后的所有记录,覆盖它,然后截断。或者,您可以将最后一条记录移动(=复制)到它,然后截断。

    2. 创建一个额外的文件并将该记录之前和之后的所有记录复制到该文件中。然后删除旧文件,重命名新文件。

    3. 将记录标记为未使用。编写新记录时,请检查您是否有任何未使用的位置并首先使用它们。

    4. 每条记录使用一个文件。

    【讨论】:

    • 我想我会将记录标记为已删除,这可能是最简单的!谢谢:)
    • 3 号得到我的投票。实现起来相当容易,而且速度最快。
    • 请注意,这一切都假设记录具有固定长度。否则,唯一真正的解决方案是 2。
    • @JamesKanze:确实,选项 1b 和 3 不适用于可变长度记录。
    • @JamesKanze 你可以有一个单独的文件来指示未使用的记录。
    【解决方案2】:

    引入删除记录的标记。因此,您需要写入 1 个符号,而不是移动大块文件。当您需要分配新记录时,您可以遍历已删除的并删除标记。

    【讨论】:

      【解决方案3】:

      好吧,从文件中删除并非易事,因为您不能直接从文件中删除一行。 一种方法是读取整个文件(或批量)并在没有所需行的情况下将其写回。 (对于大文件来说相当健壮但效率不高)。

      也许如果你把你的记录文件分成更小的分区文件,比上面的做法更有效率。

      您可以做的另一件事是将文件中的一行标记为无效(就像删除指针时在内存中所做的那样)并在需要时覆盖它,这当然取决于您如何编写记录,但我希望您能得到我想要的意思。

      【讨论】:

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