ファイル内の行を消去したい。ファイルの内容を(たとえばベクトルで)保存し、行を消去して再度書き込むことができることを私は知っています。ただし、ファイルが大きくなると非常に面倒で、あまり効率的ではありません。
より効率的でエレガントな方法を知っている人はいますか?
ディスク ファイルについて特に魔法のようなことは何もありません。データを連続した領域 (通常は「ブロック」のようなものと呼ばれます) に格納することを依然として好みます。これらの領域の真ん中にデータのない穴を残す方法はありません。したがって、これらの領域の 1 つの中央から 3 バイトを「削除」したい場合は、その領域の他のすべてを 3 バイト戻すことによって、どこかでこれを達成する必要があります。いいえ、効率的ではありません。
これが、テキスト エディター (この種の作業を頻繁に行う必要がある) が、データの移動がはるかに高速な RAM に (すべてではないにしても) できるだけ多くのファイルをロードする傾向がある理由です。通常は、要求されたとき (または定期的に) 変更をディスクに書き戻すだけです。このような多くの変更を加える必要がある場合は、彼らの本からページを取り出して、同様のことを行うことをお勧めします.
BerkeleyDB(dbopen(3))には、DB_RECNOと呼ばれるアクセスメソッドがあります。これにより、任意の種類のレコード区切り文字を使用して、任意の長さのファイルを操作できます。デフォルトでは、区切り文字としてUNIX改行を含む可変長レコードが使用されます。次に、整数インデックスを使用して各「レコード」にアクセスします。これを使用して、テキストファイルから任意の行を削除できます。これはC++に固有のものではありませんが、ほとんどのUnix / Linuxシステムを使用している場合、このAPIはすでに利用可能です。