Visualizzazione dei risultati da 1 a 5 su 5

Visualizzazione discussione

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2018
    Messaggi
    3

    [C] 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:

    codice:
    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[i].nome, sizeof(char[DIM_NOME+1]), 1, fp );
            fwrite(&informazioni.array_giocatori[i].stanza, sizeof(int), 1, fp );
            fwrite(&informazioni.array_giocatori[i].ipotesi, sizeof(int), 1, fp );
            fwrite(&informazioni.array_giocatori[i].num_carte, sizeof(int), 1, fp );
            for(j=0; j<informazioni.array_giocatori[i].num_carte; j++){
                fwrite(&informazioni.array_giocatori[i].mano[j].info.tipo, sizeof(Tipo_carta), 1, fp);
                fwrite(&informazioni.array_giocatori[i].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[i].info.tipo, sizeof(Tipo_carta), 1, fp);
            fwrite(&informazioni.mazzo_intero[i].info.nome_carta, sizeof(char[DIM_DESCRIZIONE+1]), 1, fp);
        }
        informazioni.incognite=incognite;
        for(i=0; i<NUM_INCOGNITE; i++){
            fwrite(&informazioni.incognite[i].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 grato se mi aiutaste a risolvere il problema, grazie anticipatamente.
    Ultima modifica di alka; 02-03-2018 a 18:09 Motivo: Formattazione del codice

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.