Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    Scrittura su file binario [C]

    Ciao a tutti, sono un nuovo iscritto, e avrei bisogno di un aiuto.
    Dovrei stampare su un file binario 4 strutture i cui valori sono stati presi durante l'esecuzione del programma.
    Quindi avrò: struttura di nome Libro, struttura Autore, struttura CasaEditrice, struttura Editore.

    codice:
    void Scrivi(Libro * l, Autore *a, CasaEditrice *c, Editore * e)
    {
        File * file=NULL;
        file=fopen("Libri.dat", "wb");
        if(file==NULL)
          exit(-1);
    
         //Devo scrivere tutti i libri di un unico autore, quindi faccio una sola fwrite
         fwrite(a,sizeof(Autore), 1, file);
    
        //Ho un dubbio se dovendo stampare più libri di uno stesso autore, debba fare un for
        for(i=0;i<a->num_libri;i++)
           fwrite(l,sizeof(Libro), 1, file)
     
       //Oppure modificare la dimensione della fwrite
       fwrite(l,sizeof(Libro), a->num_libri, file);
    
       fclose(file);
    }
    Il dubbio sta anche nel fatto che secondo me, siccome va scritto tutto in un unico file, una volta che scrivo l'autore, poi devo chiudere il file e riaprirlo per i libri con modalità "ab".
    Il problema è che certe volte mi dà molti più libri di quelli che effettivamente l'autore ha scritto e i dati del primo libro non corrispondono a quelli inseriti durante l'esecuzione, e quelli dopo invece sono tutti a 0. Penso quindi che stia sbagliando a scrivere sul file.

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Tu scrivi sul file blocchi di dati di dimensione diversa "le varie struct non sono tutte uguali", per la scrittura su file non comporta un problema, ma per la lettura devi sapere esattamente come è strutturato il file, la sequenza e il tipo di dati che vai a leggere, quindi la cosa si complica, dovresti tenere registrato "magari su un file secondario" la sequenza di quello che scrivi, esempio puoi attribuire un numero per ogni tipo di struct, 1-2-3-4, e su un file avrai una sequenza che registra cosa hai salvato, esempio 1113222, dovrai leggere dal file binario tre struct di tipo uno, una di tipo tre, e tre di tipo 2, in questo modo la lettura dovrebbe andare a buon fine.
    Tecnologia

  3. #3
    Intanto grazie per la risposta immediata, però ancora purtroppo non ci sono arrivato alla lettura ahahahah Non riesco a fare bene la scrittura...

  4. #4
    Sono riuscito a risolvere con la scrittura. Ora come dici tu, quando leggo, mi crasha il programma. Ho capito ciò che dici, il dubbio che mi viene è: come faccio a scrivere su file binario dei numeri corrispondenti al numero di strutture che scrivo inizialmente per ogni tipo?

  5. #5
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    É impossibile capire il problema senza vedere il codice che usi e hai scritto.
    Tecnologia

  6. #6
    Prima di postare il codice ti faccio solo un'altra domanda: ma se io devo leggere il file in ordine, quindi con tutti gli elementi che ho scritto, è importante che faccia quello che hai detto tu?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quando leggi devi usare le stesse strutture nello stesso ordine, altrimenti hai problemi (tra cui crash).

    Quindi, se dici quali sono le "regole" per scrivere i dati (quali strutture, in quale ordine e quantità) si può tentare di rispondere ... altrimenti no.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Sì io le utilizzo in ordine. Allora funziona così: una volta salvato il file con tutti i dati delle strutture (in ordine: Libro, Autore, CasaEditrice, Editore), devo rileggere tutti i dati per poter poi aggiungere altri libri di quello stesso autore. Quindi faccio così nella funzione:

    codice:
    void Leggi(Libro* l,Autore*a,CasaEditrice*c,Editore* e)
    {
        File* file=NULL;
        file=fopen("Libri.dat","rb");
        if(file==NULL)
          exit(-1);
    
    
    fread(l,sizeof(Libro),l->totlibri, file);
    fread(a,sizeof(Autore),1, file);
    fread(c, sizeof(CasaEditrice),1,file);
    fread(e, sizeof(Editore),e->toteditori,file);
     
    
    
       fclose(file);
    }


    Quando però vado sul main e richiamo la funzione, crasha.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma tu prima scrivi l'Autore ma leggi i Libri ??

    Controlla l'ordine di quello che scrivi e quanto ne scrivi. Non puoi leggere diversamente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    A prescindere dall'operazione che devo effettuare dopo, quindi quella di aggiungere libri di uno stesso autore (anche perchè poi si deve controllare che l'utente non ne inserisca uno uguale), se io volessi leggere tutti i dati dal file che ho scritto precedentemente, secondo me le cose da fare sono quelle scritto in altro. Poi ovvio che c'è qualcosa di sbagliato, ma non capisco cosa. Inoltre ho appena visto che il crash è un errore dovuto alla Segmentatio Fault. Provo a rispiegare una cosa, che rileggendo ho capito di essermi espresso male:
    Il crash non si verifica dentro la funzione di lettura, ma nel main. Quando vado (giusto per controllare che sia andato tutto bene) a fare delle printf per verificare che sia stato scritto tutto, crasha dando l'errore di Segmentation Fault. In particolare per leggere tutti i libri faccio un for che cicla per tutti i libri (l->totlibri) e per ognuno stampo i campi, per es: l[i].titolo

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.