本当にすべてのファイルを読み取り、必要のないものは無視する必要があります。
fseek
あまり役に立ちません: ファイルをバイト オフセット (ファイルの先頭または末尾からの相対位置) に配置し、行の境界を認識しません。
実際、ファイル内の行は定義が不十分な概念です。多くの場合、行は、改行 ( ) で終わる一連のバイト (改行文字とは異なります'\n'
) です。一部のオペレーティング システム (Windows、MacOSX) は、特別な方法でテキスト ファイルを読み取ります (たとえば、実際のファイルには\r\n
各行の末尾に含まれていますが、C ライブラリは、読んだような錯覚を与えます\n
)。
実際には、行入力ルーチンを特にgetline
(またはおそらくfgets
) 使用することをお勧めします。
使用する場合は、ライン バッファーの処理にgetline
注意する必要があります。free
テキスト ファイルの構造が非常に規則的である場合はfscanf
、行の境界を気にせずに (スキップする必要があるものを無視して) データを削除する可能性があります。
絶対に使用したい場合fseek
(これは間違いです)、ファイルを 2 回読み取る必要があります。1 回目は各行の開始 (または終了) を覚え、2 回目は行の開始点を覚えますfseek
。それでも、ファイルの途中にバイトを挿入できないため、更新には機能しません。
そして実際には、最もコストのかかる操作は実際のディスク読み取りです。バッファリング (一部はカーネルと<stdio.h>
関数によって実行され、一部は行を処理するときに実行されます) は無視できます。
もちろん、ファイル内の一部の行をその場で変更することはできません。それを行う必要がある場合は、入力用にファイルを処理し、出力ファイル (変更された入力を含む) を生成し、終了したら名前を変更します。
ところで、 GDBMなどのインデックス付きファイルや、 SqlLite 、 MariaDb 、 mongodb などのデータベースに興味があるかもしれません。また、 JSONやYAMLなどの標準的なテキストのシリアライゼーション形式にも興味があるかもしれません(どちらにも多くのライブラリがあります)。 、C の場合でも、それらに対処するため)。