从文件C ++中删除记录

时间:2012-05-17 10:24:28

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

我正在使用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()相当的东西......还是不是那么简单?

3 个答案:

答案 0 :(得分:2)

介绍已删除记录的标记。因此,不需要移动大块文件,而是需要编写1个符号。当您需要分配新记录时,您可以迭代已删除并只删除标记。

答案 1 :(得分:2)

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

可能的选择:

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

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

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

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

答案 2 :(得分:1)

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

也许如果你将记录文件划分为较小的分区文件而不是上述操作会更有效率。

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