1

.datファイルのレコードを追加、編集、および削除するためのC++の単純なデータベースコンソールアプリケーションに取り組んでいます。追加と変更がありますが、このシナリオでの削除の概念を理解するのが難しいと感じています。以下は私がレコードを書く方法です。

レコードを書く

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()か、それともそれほど単純ではないのですか?

4

3 に答える 3

2

削除されたレコードのマーカーを導入します。したがって、ファイルの大きなチャンクを移動する代わりに、1つのシンボルを書き込む必要があります。新しいレコードを割り当てる必要がある場合は、すでに削除されているものを繰り返し処理して、マーカーを削除するだけです。

于 2012-05-17T10:27:57.657 に答える
2

CおよびC++には、ファイルの一部を削除する機能はありません。多くのオペレーティングシステムもそうではありません。

可能なオプション:

  1. これが最後のレコードである場合は、ファイルを切り捨てます。そうでない場合は、その後のすべてのレコードを移動(=コピー)し、上書きしてから切り捨てます。または、最後のレコードをそのレコードに移動(=コピー)してから切り捨てることもできます。

  2. 追加のファイルを作成し、このレコードの前後のすべてのレコードをそのファイルにコピーします。次に、古いファイルを削除し、新しいファイルの名前を変更します。

  3. レコードを未使用としてマークします。新しいレコードを作成するときは、未使用の場所があるかどうかを確認し、最初にそれらを使用してください。

  4. レコードごとにファイルを使用します。

于 2012-05-17T10:31:28.240 に答える
1

ファイルから行を直接削除することはできないため、ファイルからの削除は簡単ではありません。1つのアプローチは、ファイル全体(または一括)を読み取り、必要な行なしで書き戻すことです。(非常に堅牢で、大きなファイルには効率的ではありません)。

おそらく、レコードファイルをより小さなパーティションファイルに分割する場合は、上記を実行するよりも効率的です。

もう1つの方法は、ファイル内の行を無効としてマークし(ポインターを削除するときにメモリ内で行われるように)、必要に応じて上書きすることです。これはもちろん、レコードの書き込み方法によって異なりますが、私が言っていることを理解していただければ幸いです。

于 2012-05-17T10:28:45.937 に答える