1

複数のレコードを含むCSV形式のバイナリファイルがあります。各レコードは、user_name、last_name、first_name、num_wins、num_losses、num_tiesとして入力されます。特定のプレーヤーの勝ち、負け、引き分けの記録を更新するメソッドを作成しています。ユーザーは変更するユーザー名を入力し、続いて勝ち、負け、引き分けに変更を加えます。たとえば、smithj 4 5 1.これにより、smithjレコードが検索され、勝ちに4が追加されます。

これを実現するためにlseekまたはfseekを使用するにはどうすればよいですか?または、これを行う別の方法はありますか?

4

3 に答える 3

1

ファイルがテキストファイルであると仮定すると、行を一定の幅にパディングする必要があります。次に、lseek()、read()、およびwrite()を使用して行を変更します。各行の長さを一定にすることは非常に重要です。これにより、各行の開始位置を計算できます。

于 2010-10-18T02:20:29.043 に答える
1

各レコードが同じバイト数であれば、これはかなり簡単です。最初のレコードをチェックして一致するかどうかを確認し、一致しない場合fseek(f, record_size, SEEK_CUR);は次のレコードをチェックします。

各レコードのバイト数が異なる場合、私が考えることができるのは、レコードのバイト数を実際のレコードの前に置くことだけです。そして、それを読み込んでから、次のレコードサイズに到達するためにそのバイト数をfseek()します。私はいくつかのバイナリファイル形式がこれを行うのを見てきました。これは物事をかなり簡単にします。

于 2010-10-18T02:22:21.113 に答える
1

例の記述の要求への応答-固定サイズのレコードを想定:

enum { RECSIZE = 256 };

char buffer[RECSIZE];
FILE *fp = ...;   // File to read from and write to

int recnum = 37;  // Counting from record 0
long offset = recnum * RECSIZE;

if (fseek(fp, offset, SEEK_SET) != 0)
    ...error...
if (fread(buffer, sizeof(buffer), 1, fp) != 1)
    ...error...
...modify buffer...
if (fseek(fp, offset, SEEK_SET) != 0)
    ...error...
if (fwrite(buffer, sizeof(buffer), 1, fp) != 1)
    ...error...

recnum変更する必要のあるレコードごとに、の宣言から最後までコードを1回繰り返します(ループを考えてください)。

編集時にサイズが変化する可変サイズのレコードでは、かなりの労力を費やす必要があります。そのため、古いファイルを一度に1レコードずつメモリにコピーし、レコードを適切に変更してから、レコードを新しいファイルに変更しました。

于 2010-10-18T06:35:14.393 に答える