Salvare una struttura dati in [C] su file

di il
2 risposte

Salvare una struttura dati in [C] su file

Buonasera, vorrei un aiuto per poter salvare una struttura dati (Lista) con al suo interno altre strutture dati.
In poche parole sto creando un programma per l'azienda di un mio amico che memorizza i dati dei clienti, quindi vorrei poter salvare questi dati in qualche modo. All'università ci hanno insegnato a salvare i dati in un documento di testo ma credo sia difficile poi leggere di nuovo questi dati, quindi ho letto su internet che è consigliabile un file binario. Qualche consiglio?

2 Risposte

  • Re: Salvare una struttura dati in [C] su file

    Caveat: non prendere quel che ti dico come se fosse un dato di fatto, perché sono solo un hobbista e talora prendo delle sonore cantonate.

    Memorizzando i dati binari ottieni la possibilità di caricare le strutture d'un botto, ogni blocco un'intera struttura (ammesso che quelle strutture non usino memoria indicata tramite puntatori e collocata "esternamente" alla struttura stessa), però ti ritrovi esposto ad almeno due inconvenienti che mi vengono in mente (sempre nei limiti delle mie scarne conoscenze):

    1) se cambi tipo di computer puoi incorrere in possibili inconvenienti dovuti all'ordine dei byte e/o (se comprendi righe di testo) alla codifica dei caratteri, degli a-capo e cose del genere; sono inconvenienti che si aggirano, basta sapere che esistono e tenerne conto
    2) i file sarebbero relativamente "impermeabili" all'occhio umano, il che in caso sorgesse la necessità di recuperare i dati in situazioni di "emergenza" potrebbe dare dei grattacapi

    Come minimo, assicurati di scrivere da qualche parte con chiarezza una specie di manuale di riferimento dove spieghi (anche a te stesso, qualora dovessi rimetterci mano a distanza di tempo) come sono organizzati i dati nei file.

    Con i file in formato testuale aggiri QUESTI inconvenienti. Ovviamente ne sorgono altri, tipo, come hai detto tu stesso, la scomodità del predisporre la scansione e la conversione dei dati.

    Ripeto: prendi con le molle queste mie affermazioni.
  • Re: Salvare una struttura dati in [C] su file

    Ti copio-incollo i suggerimenti del mio prof per risolvere un esercizio mooolto simile al tuo, vedi tu se puoi trovarli utile:

    traccia: «Salvare» una lista su file e «ricaricarla»
    • Supponiamo di avere in memoria una generica lista
    dinamica, definita nel modo "consueto":
    typedef struct Elem { Tipo dato;
    struct Elem * next; } Nodo;
    • Vogliamo scrivere due funzioni
    – void saveList( Nodo * lista, FILE * fp );
    – Nodo * loadList( FILE * fp );
    che salvano su file il contenuto della lista e
    ricostruiscono una lista analoga a quella salvata
    Così la lista potrà sopravvivere al tempo di vita del programma

    SOLUZIONE COME FILE DI TESTO
    • Scrittura
    – Scriviamo sul file, in forma di sequenza di stringhe, il contenuto
    di tutti i nodi, elencando separatamente campi e/o elementi di
    Tipo (se si tratta di un tipo struct e/o array)
    • Operiamo le eventuali conversioni necessarie dai generici
    tipi base in stringhe (interi, float, … convertiti in opportune
    stringhe)
    • Lettura
    – Leggiamo uno alla volta i valori dal file, riempiendo i nodi di una
    lista via via allocati per accogliere tali valori
    • Operiamo le conversioni opposte, in base alla
    corrispondenza posizionale tra i valori e i campi (il primo
    valore nel primo campo, il secondo nel secondo, …
    convertendo stringhe ? interi, float, …)
    • Con questa strategia il file generato è ragionevolmente leggibile (e modificabile)
    da parte dell'occhio umano, intervenendo con un normale editor di testo

    SOLUZIONE COME FILE BINARIO
    • Scrittura
    – Scriviamo sul file una sequenza di "blocchi di byte" che siano
    ognuno la "immagine fedele" (bit a bit) del contenuto della
    memoria occupata dai dati (di tipo Tipo), senza conversioni
    • In questo modo un intero di valore 35 non sarà rappresentato
    dai caratteri consecutivi '3' e '5', ma dai byte della sua codifica in
    complemento a due (00000000 00000000 00000000 00100011)
    • Ogni blocco scritto "misura" esattamente sizeof(Tipo) byte
    • Lettura
    – Leggiamo i blocchi di byte dal file a ritmo di sizeof(Tipo),
    riempiendo progressivamente i nodi di una lista
    • La corrispondenza è ancora posizionale, ma direttamente sulle
    celle di memoria, "riempite" nell'ordine in cui furono "svuotate"
    • Il file così generato è (di norma) del tutto illeggibile per l'occhio
    umano


    ATTENZIONE
    • Non possiamo salvare su file i valori dei puntatori e sperare che, in futuro, alla loro lettura
    (da parte di un altro programma, magari su altro elaboratore) essi siano ancora
    validamente dereferenziabili
    • Salviamo i dati su file nell'ordine in cui compaiono nella lista, e l’ "infrastruttura di
    collegamento" (i puntatori) dovrà essere ricreata ogni volta che si carica la lista
    • N.B. Attenzione anche al contenuto dei dati…
    – È possibile che i dati contenuti nei nodi (cioè le struct di tipo Tipo) siano direttamente
    contenuti nella struct, senza puntatori ad altre parti (stringhe o altri dati dinamici).
    – Ma è anche possibile che il Tipo contenga puntatori ad altri dati… ovviamente anche quei
    puntatori, se messi su file, perderebbero significato!
    • Occorre recuperare i dati puntati e salvare su file anche quelli, per poter poi ricostruire la lista…
Devi accedere o registrarti per scrivere nel forum
2 risposte