Как сохранить / прочитать массивы структур (с внутренним списком ссылок) в двоичных файлах - PullRequest
0 голосов
/ 26 мая 2019

Я заканчиваю игру по автомобильным гонкам, в которой пользователь может создать чемпионат с несколькими гонками.

Каждая гонка имеет свои данные (заезды, максусерверы) и указатель на связанный список пилотов, которыегонки в гонке.

Каждый пилот из связанного списка имеет указатель на массив для хранения своего времени на каждом круге

В основном мне нужно сохранить чемпионат в двоичном файле, чтобы пользователь могпродолжать чемпионат каждый раз, когда он открывает программу

typedef struct dataPair pair, *ppair;
typedef struct dataRace race, *prace;

struct dataRace{
    int laps;
    int size;
    int maxUsers;
    ppair pilots;
};
struct dataPair {
    pilot p; //piloto
    car c;  //carro
    int *times; // pointer for the times
    ppair next;   

};

Я получил этот массив для чемпионата

prace champ=getData() //ask's how many laps and then malloc(laps*sizeof(race))

, например, если в чемпионате 3 гонки, я получаю к ним доступ с помощью

 champ[0]\\ 1º race
 champ[1]\\ 2º race
 champ[2]\\ 3º race

Функция чтения, которую я сделал

 f = fopen("champ.dat", "rb");
 fread(&nraces, sizeof(int), 1, f); //read's how many races there are

 prace champ=malloc(nraces*sizeof(race));

 ppair headpil=NULL;

 for(i=0; i<nraces; i++){

        fread(&(champ[i]), sizeof(race),1, f);

        npils=champ[i].maxUsers;
        nlaps=champ[i].laps;

        for(x=0;x<npils;x++){
            ppair newpil=malloc(sizeof(pair));

            fread(&newpil, sizeof(pair), 1,f);

            fread(&nraces->times,nlaps*sizeof(int),1,f);

            newpil->next=headpil;
            headpil=newpil;
        }
        champ[i].pilots=headpil;
  }
  return champ;

Функция записи, которую я сделал

void saveChamp(prace list, int nraces){
    FILE *f;
    int i;
    ppair pilots;
    f = fopen("champ.dat", "wb");

    fwrite(&nraces, sizeof(int), 1, f);
    for(i=0; i<nraces; i++){
        int tam=list[i].laps;

        fwrite(&(list[i]), sizeof(race), 1, f);

        pilots=lista[i].pilots;
        while(pilots!=NULL){
            fwrite(pilots, sizeof(pair), 1, f);
            fwrite(pilots->times,tam *sizeof(int),1,f);   

            pilots=pilots->next;
        }

    }
}

Я не вижу, работает ли функция, которая сохраняет, потому что функция, которая читает, не работаетработает

...