1

すべてのレコードワーカーのバイナリファイルとテキストファイルがあるとします。デフォルトの合計月時間はすべて0に設定されています。バイナリの特定の月に実際にアクセスして、目的の値に変更するにはどうすればよいですか。

これはテキストファイル形式です

ID名JFM
 1ジェーン000
 2マーク000
 3ケルビン000

ID名JFM
 1ジェーン0025
 2マーク0030
 3ケルビン0040

25は、実際には3月に働いた時間数です。

4

2 に答える 2

3

ここでの最初の質問は、「バイナリ」の意味だと思います。ファイルの形式を文字どおりに示していますか?つまり、入力時、文字は '0' になるか '\0' になるか? 完了したら、ファイルに 2 桁の '3' と '0' を含めますか、それとも 1 文字の '\25'、'\30' または '\40' を含めますか?

入力のために各レコードの既知のオフセットで単一の文字を扱っていて、結果のためにそれを単一の文字に置き換えたい場合、物事は非常に簡単です: ファイル内の正しいオフセットを探し、バイトを書き込み、次のオフセットを探し、すべてのレコードを更新するまで続行します。

入力ファイルに文字列が含まれている場合、値を更新するとその長さが (おそらく) 変更され、データを読み込んでメモリ内で変更し、新しいデータを (通常は新しいファイル)。これも非常に簡単ですが、ファイルが大きい場合は遅くなる可能性があります。

これを実際のプログラムで実行している場合は、自分で実行することをまったく考えません。代わりに、 SQLiteのようなものを使用してデータを処理することを検討します。これにより、コードが単純化されるだけでなく、クライアントの生活がかなり快適になります。既知の/文書化されたファイル形式を使用するため、他のツールがデータを操作したり、バックアップを実行したりできます。トランザクション、ロギング、ロールバックなどをサポートしています。

于 2013-01-16T18:34:30.407 に答える
1

ファイルはバイトのストリームです。関数fopenfreadfwriteのcファミリを使用してファイルにアクセスできます。または、c++iostream操作を介して。いずれの場合も、通常はその位置を知り、そのレコードを読み書きすることによってレコードを見つける必要があります。レコードのサイズが固定されていない場合は、後続のすべてのレコードの移動を処理する必要があります。

于 2013-01-16T18:18:46.730 に答える