我正在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 和 C++ 没有删除部分文件的函数。许多操作系统也没有。
可能的选项:
-
如果这是最后一条记录,请截断该文件。如果没有,请移动(=复制(它后面的所有记录,覆盖它,然后截断。或者,您可以将(=复制(最后一条记录移动到其中,然后截断。
-
创建一个额外的文件,并将此记录之前和之后的所有记录复制到该文件中。然后删除旧文件并重命名新文件。
-
将记录标记为未使用。写入新记录时,请检查是否有任何未使用的位置并首先使用它们。
-
每条记录使用一个文件。
引入已删除记录的标记。因此,您需要写入 1 个符号,而不是移动大块文件。当您需要分配新记录时,您可以迭代已删除的记录并删除标记。
好吧,从文件中删除并非易事,因为您无法直接从文件中删除行。一种方法是读取整个文件(或批量读取(并将其写回,而无需所需的行。(相当健壮,对于大文件效率不高(。
也许如果您将记录文件分成较小的分区文件,则执行上述操作会更有效。
您可以做的另一件事是将文件中的一行标记为无效(就像删除指针时在内存中所做的那样(并在需要时覆盖它,这当然取决于您如何编写记录,但我希望您明白我的意思。