すべてのレコードワーカーのバイナリファイルとテキストファイルがあるとします。デフォルトの合計月時間はすべて0に設定されています。バイナリの特定の月に実際にアクセスして、目的の値に変更するにはどうすればよいですか。
これはテキストファイル形式です
ID名JFM 1ジェーン000 2マーク000 3ケルビン000
に
ID名JFM 1ジェーン0025 2マーク0030 3ケルビン0040
25は、実際には3月に働いた時間数です。
すべてのレコードワーカーのバイナリファイルとテキストファイルがあるとします。デフォルトの合計月時間はすべて0に設定されています。バイナリの特定の月に実際にアクセスして、目的の値に変更するにはどうすればよいですか。
これはテキストファイル形式です
ID名JFM 1ジェーン000 2マーク000 3ケルビン000
に
ID名JFM 1ジェーン0025 2マーク0030 3ケルビン0040
25は、実際には3月に働いた時間数です。
ここでの最初の質問は、「バイナリ」の意味だと思います。ファイルの形式を文字どおりに示していますか?つまり、入力時、文字は '0' になるか '\0' になるか? 完了したら、ファイルに 2 桁の '3' と '0' を含めますか、それとも 1 文字の '\25'、'\30' または '\40' を含めますか?
入力のために各レコードの既知のオフセットで単一の文字を扱っていて、結果のためにそれを単一の文字に置き換えたい場合、物事は非常に簡単です: ファイル内の正しいオフセットを探し、バイトを書き込み、次のオフセットを探し、すべてのレコードを更新するまで続行します。
入力ファイルに文字列が含まれている場合、値を更新するとその長さが (おそらく) 変更され、データを読み込んでメモリ内で変更し、新しいデータを (通常は新しいファイル)。これも非常に簡単ですが、ファイルが大きい場合は遅くなる可能性があります。
これを実際のプログラムで実行している場合は、自分で実行することをまったく考えません。代わりに、 SQLiteのようなものを使用してデータを処理することを検討します。これにより、コードが単純化されるだけでなく、クライアントの生活がかなり快適になります。既知の/文書化されたファイル形式を使用するため、他のツールがデータを操作したり、バックアップを実行したりできます。トランザクション、ロギング、ロールバックなどをサポートしています。
ファイルはバイトのストリームです。関数fopenfreadfwriteのcファミリを使用してファイルにアクセスできます。または、c++iostream操作を介して。いずれの場合も、通常はその位置を知り、そのレコードを読み書きすることによってレコードを見つける必要があります。レコードのサイズが固定されていない場合は、後続のすべてのレコードの移動を処理する必要があります。