1

私は次の構造体を持っています:

typedef struct {
  char last[NAMESIZE];
  char first[NAMESIZE];
} name;

typedef struct {
  int id;
  name name;
  float score;
} record;

typedef struct {
  record *data;
  size_t nalloc;
  size_t nused;
} record_list;

この関数を使用してファイルからレコードを読み取ろうとしています:

int file_read(record_list *list, record* rec)
{
  /* irrelevant code eliminated */

  while(fread(&records, sizeof(record), 1, fp))
  {
    *rec = records;
    valid_list_insert = list_insert(list, rec);
    if(!valid_list_insert)
    {
      return 0;
    }
  }
}

そして、この関数を使用してrecord_listをファイルに書き込もうとしています:

int file_write(record_list* list)
{
  /* irrelevant code eliminated */

  if(fwrite(&list, sizeof(record_list), 1, fp) == 0)
  {
    return 0;
  }
}

ただし、どちらも正しく機能しません。私のプログラムでrecord_listを表示しようとすると、freadはデータをランダムに読み込みます。fwrite はランダムな文字をファイルに書き込むだけです。これが機能しない理由についての助けをいただければ幸いです。

4

1 に答える 1

6

まあ、うまくいかないことの 1 つは、ポインターの書き込みです (のdataメンバーのようにrecord_list): (1) ポインターの値 (つまり、メモリ内のあるスポットの数値) を書き込み、(b) できないからです。再度読み込んだときに、同じ場所に自分のものを割り当てないでください。代わりに、構造を注意深く解析し、データを再び取得できるように記録する必要があります。

このプロセスは「シリアライゼーション」と呼ばれます (逆は「デシリアライゼーション」です)。C でのデータ構造のシリアライズも参照してください。

于 2011-08-05T00:13:26.937 に答える