FUNZIONE DI CARICAMENTO DA FILE BINARIO

di il
27 risposte

FUNZIONE DI CARICAMENTO DA FILE BINARIO

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.

27 Risposte

  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Inserisci il codice tra tag code altrimenti non si capisce nulla.

    Hai fatto un po' di debugging? Quando leggi hai visto il contenuto delle prime tre variabili lette se corrispondono a quello scritto?
    Metti dei printf e individua esattamente la linea in cui avviene l'errore
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Scusami purtoppo sono nuovo e non so come si scriva il codice qui.
    Comunque l'errore avviene appena entra nel primo for, la prima riga, ossia questa:
    fwrite(&informazioni.array_giocatori.nome, sizeof(char[DIM_NOME+1]), 1, fp );
    non viene svolta. Si ferma il debugger e non mi dice nemmeno che tipo di errore sia. Fino a questo punto le variabili passate alla struttura informazioni sono giuste, i valori p, turno e num_giocatori sono giuste.
    Stavo pensando che il problema fosse la scrittura/lettura di puntatori in un file binario, è possibile?
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Mostra le strutture
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Typedef struct {
    Tipo_carta tipo;
    char nome_carta[DIM_DESCRIZIONE+1];
    }Carte;

    struct nodo{
    Carte info;
    struct nodo *next;
    };
    typedef struct nodo Nodo;

    typedef struct{
    char nome[DIM_NOME + 1];
    int num_giocatore;
    int stanza;
    int num_carte;
    int ipotesi;//0 se e' false, 1 se e' true
    Nodo* mano;
    }Giocatore;

    typedef struct {
    Giocatore *array_giocatori;
    int turno;
    int num_giocatori;
    int carte_da_mostrare;
    Nodo *mazzo_intero;
    Nodo *incognite;
    int p;
    }Info_partita;
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Nome è già un array, quindi scriverai

    fwrite(informazioni.array_giocatori.nome, sizeof(char[DIM_NOME + 1]), 1, fp);

    senza &

    In ogni caso, controlla che array_giocatori sia un array allocato e valido perché non si capisce dove lo allochi.
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Array_giocatori è un array allocato dinamicamente, ho controllato che l'allocazione vada a buon fine.
    Ho provato a togliere la & commerciale, ma quando supera il primo for nella funzione di caricamento, nella prima riga si interrompe lo stesso.
    Non riesco a risolvere..
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Così non aiuti a risolvere ...

    Stai dicendo che l'errore è un altro in un altro punto?
    Superato il for ? Dove è adesso l'errore?

    Posta TUTTO il codice, senza parti mancanti, compreso main, strutture, definizioni e allocazioni, in modo che si possa compilare ...
    Usa i TAG CODE per postare il codice ... vedi Regolamento ...
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    No, scusami l'errore è sempre lo stesso.. se leggi il primo messaggio, scrivo che appena entra nel primo ciclo for, alla prima riga, si interrompe.
    Sto pensando che il problema sia che sto passando dei puntatori a un FILE binario, si possono passare oppure no?
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Ripeto ... posta tutto e compilo ... così non se ne esce.

    P.S. Qui il CROSSPOSTING è vietato. E NON è molto bello, mentre ti sto aiutando, postare in altro forum.
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Come ho scritto nell'altro Forum, ho postato in entrambi perchè mi servirebbe una mano in tempi rapidi. Non per mancanza di fiducia, la discussione nell'altro forum cancellala pure. Comunque il problema può essere che non posso salvare puntatori in un file binario?
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Ti ho detto di postare tutto e tu perdi tempo in altri commenti. In questo modo non avrai risposta ... e certamente è una cosa un po' irritante dover chiedere continuamente di postare tutto il codice ...
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Scusa, tutto il codice non posso postarlo. Credevo di riuscire a risolvere con le funzioni in cui mi crea il problema, cioè in quella di caricamento dei valori.
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Non capisco perché non puoi postarlo ... Il problema può essere ovunque, nelle allocazioni, nelle chiamate ... E' necessario compilare ed eseguire, facendo del debugging preciso che tu non sai fare ...

    Al limite, potresti eliminare i menu e le altre funzioni non utili, ma le strutture, le definizioni, il main, l'allocazione, la chiamata sono necessarie ...
    Se non riesci a postare neanche tutto questo, mi dispiace, non si riesce altrimenti. Buona fortuna.
  • Re: FUNZIONE DI CARICAMENTO DA FILE BINARIO

    Qui di seguito posto le strutture e la funzione dove alloco dinamicamente l'array_giocatori, poi la chiamata della funzione nel main, il resto del codice è quello che ho postato precedentemente nei messaggi iniziali, in quel caso non ho scritto la chiamata nel main perchè la funzione di salvataggio non ha un tipo di ritorno. Spero che così si riesca a risolvere.
    Grazie.
    
    typedef enum {arma, sospetto, stanza}Tipo_carta;
    
    typedef struct {
        Tipo_carta tipo;
        char nome_carta[DIM_DESCRIZIONE+1];
    }Carte;
    
    struct nodo{
        Carte info;
        struct nodo *next;
    };
    typedef struct nodo Nodo;
    
    typedef struct{
        char nome[DIM_NOME + 1];
        int num_giocatore;
        int stanza;
        int num_carte;
        int ipotesi;//0 se e' false, 1 se e' true
        Nodo* mano;
    }Giocatore;
    
    typedef struct {
        Giocatore *array_giocatori;
        int turno;
        int num_giocatori;
        int carte_da_mostrare;
        Nodo *mazzo_intero;
        Nodo *incognite;
        int p;
    }Info_partita;
    
    Giocatore *acquisisci_giocatori (Giocatore *array_giocatore, int num_giocatori){
        int i;
        array_giocatore=(Giocatore*)malloc(sizeof(Giocatore)*num_giocatori);
        if(array_giocatore==NULL){
            printf("\nErrore!");
            exit(-1);
        }
        for(i=0; i<num_giocatori; i++){
            array_giocatore[i].num_giocatore=i;
            array_giocatore[i].ipotesi=0;
            printf("\nInserisci il nome del giocatore %d: ", i+1);
            scanf("%s", array_giocatore[i].nome);
        }
        return array_giocatore;
    }
    
    main{
    
    array_giocatori = acquisisci_giocatori(array_giocatori, num_giocatori);
    
    }
    
Devi accedere o registrarti per scrivere nel forum
27 risposte