Ciao a tutti, ho un problema con una funzione di caricamento, questo mi sta bloccando da un po' di tempo.
Ho una funzione in cui salvo i dati su un file binario, che è la seguente:
Info_partita salva_partita (Giocatore *array_giocatori, int turno, int num_giocatori, int carte_da_mostrare, Nodo* mazzo_intero, Nodo* incognite, int p, Info_partita informazioni){
int i=0, j=0;
FILE *fp=NULL;
fp = fopen("partita.sav", "wb");
if(fp==NULL){
printf("\nErrore nell'apertura del FILE");
exit(-1);
}
informazioni.p=p;
informazioni.turno=turno;
informazioni.num_giocatori=num_giocatori;
fwrite(&informazioni.p, sizeof(int), 1, fp);
fwrite(&informazioni.turno, sizeof(int), 1, fp);
fwrite(&informazioni.num_giocatori, sizeof(int), 1, fp);
informazioni.array_giocatori=array_giocatori;
for(i=0; i<num_giocatori; i++){
fwrite(&informazioni.array_giocatori.nome, sizeof(char[DIM_NOME+1]), 1, fp );
fwrite(&informazioni.array_giocatori.stanza, sizeof(int), 1, fp );
fwrite(&informazioni.array_giocatori.ipotesi, sizeof(int), 1, fp );
fwrite(&informazioni.array_giocatori.num_carte, sizeof(int), 1, fp );
for(j=0; j<informazioni.array_giocatori.num_carte; j++){
fwrite(&informazioni.array_giocatori.mano[j].info.tipo, sizeof(Tipo_carta), 1, fp);
fwrite(&informazioni.array_giocatori.mano[j].info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
}
informazioni.carte_da_mostrare=carte_da_mostrare;
fwrite(&informazioni.carte_da_mostrare, sizeof(int), 1, fp);
informazioni.mazzo_intero=mazzo_intero;
for(i=0; i<informazioni.carte_da_mostrare; i++){
fwrite(&informazioni.mazzo_intero.info.tipo, sizeof(Tipo_carta), 1, fp);
fwrite(&informazioni.mazzo_intero.info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
informazioni.incognite=incognite;
for(i=0; i<NUM_INCOGNITE; i++){
fwrite(&informazioni.incognite.info.tipo, sizeof(Tipo_carta), 1, fp);
fwrite(&informazioni.incognite[i].info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
fclose(fp);//chiude il file
return informazioni;
}
Successivamente vorrei caricare i dati salvati se l'utente lo richiede con questa funzione:
Info_partita carica_partita (Info_partita informazioni){
int i=0, j=0;
FILE *fp=NULL;
fp = fopen("partita.sav", "rb");
if(fp==NULL){//controlla che l'apertura del file sia andata a buon fine, eventualmente stampa l'errore e esce
printf("\nErrore nella letture del FILE");
exit(-1);
}
fread(&informazioni.p, sizeof(int), 1, fp);
fread(&informazioni.turno, sizeof(int), 1, fp);
fread(&informazioni.num_giocatori, sizeof(int), 1, fp);
for(i=0; i<informazioni.num_giocatori; i++){
fread(&informazioni.array_giocatori->nome, sizeof(char[DIM_NOME+1]), 1, fp );
fread(&informazioni.array_giocatori->stanza, sizeof(int), 1, fp );
fread(&informazioni.array_giocatori[i].ipotesi, sizeof(int), 1, fp );
fread(&informazioni.array_giocatori[i].num_carte, sizeof(int), 1, fp );
for(j=0; j<informazioni.array_giocatori[i].num_carte; j++){
fread(&informazioni.array_giocatori[i].mano[j].info.tipo, sizeof(Tipo_carta), 1, fp);
fread(&informazioni.array_giocatori[i].mano[j].info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
}
fread(&informazioni.carte_da_mostrare, sizeof(int), 1, fp);
for(i=0; i<informazioni.carte_da_mostrare; i++){
fread(&informazioni.mazzo_intero[i].info.tipo, sizeof(Tipo_carta), 1, fp);
fread(&informazioni.mazzo_intero[i].info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
for(i=0; i<NUM_INCOGNITE; i++){
fread(&informazioni.incognite->info.tipo, sizeof(Tipo_carta), 1, fp);
fread(&informazioni.incognite->info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
}
return informazioni;
}
ma appena entra nel primo ciclo for, si interrompe.
premetto che 3 campi di questa struttura "Info_partita informazioni", hanno delle liste al loro interno.
Il campo array_giocatori è un puntatore di un tipo che è una struttura, contenente diversi campi tra i quali una lista;
il campo mazzo_intero è una lista che contiene una info che è una struttura con 2 campi;
idem come sopra per il campo incognite.
Vi sarei molto grato se mi aiutaste a risolvere il problema. Vi ringrazio anticipatamente.