Использование fread / fwrite для чтения и записи структур в и из файла в C - PullRequest
1 голос
/ 05 августа 2011

У меня есть следующие структуры:

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;
  }
}

Однако ни один из них не работает правильно. fread считывает данные в случайном порядке, когда я пытаюсь отобразить список записей в моей программе. И fwrite просто записывает случайные символы в файл. Любая помощь о том, почему это не работает, будет принята с благодарностью.

1 Ответ

6 голосов
/ 05 августа 2011

Хорошо, одна вещь, которая будет не работать, - это написание указателей (как в data члене record_list): потому что (1) оно запишет значение указателя (то есть числового значения некоторого места в памяти) и (b) вы не будете размещать свои вещи в том же месте, когда будете читать их снова. Вместо этого вам придется тщательно проанализировать структуру и записать данные так, чтобы вы могли получить их снова.

Этот процесс называется «сериализация» (и наоборот - «десериализация»). См. Также Сериализация структур данных в C .

...