消去したいすべての文字を。で上書きできます'\x7f'
。次に、ファイルを読み取るときに、リーダーはその文字を無視します。もちろん、これは文字を使用しないテキストファイルがあることを前提としていますDEL
。
std::istream &
my_getline (std::istream &in, std::string &s,
char del = '\x7f', char delim = '\n') {
std::getline(in, s, delim);
std::size_t beg = s.find(del);
while (beg != s.npos) {
std::size_t end = s.find_first_not_of(del, beg+1);
s.erase(beg, end-beg);
beg = s.find(del, beg+1);
}
return in;
}
ヘンクが指摘するように、あなたはあなたのとして行動するために別のキャラクターを選ぶことができますDELETE
。ただし、この手法は、削除する行に関係なく機能し(最初の行に限定されません)、ファイルシステムをいじくり回す必要がないという利点があります。
変更されたリーダーを使用すると、ファイルを定期的に「最適化」できます。または、コンテンツが別のファイルにストリーミング/マージされたり、別のマシンにアーカイブされたりすると、デフラグが自然に発生する可能性があります。
編集:あなたはそれを明示的には言いませんが、これはある種のロギングアプリケーション用であり、目標はログファイルのサイズに上限を設けることであると推測しています。ただし、それが目標である場合は、小さなログファイルのコレクションを使用する方がはるかに簡単です。約10MBのログファイルを維持し、ログの合計が4GBに制限されているとします。つまり、約400ファイルになります。401番目のファイルが開始されると、そこに書き込まれる行ごとDELETE
に、最初のファイルの連続する行でマーカーを使用できます。すべての行に削除のマークが付けられると、ファイル自体を削除して、約400個のファイルを残すことができます。行が削除されている間に最初のファイルが閉じられない限り、隠されたO(n 2 )の動作はありません。
ただし、ログシステムが1番目と401番目のファイルをそのまま保持し、402番目のファイルに移動するときに1番目のファイルを削除できるようにする方が簡単です。