+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

Accedere a dati memorizzati in file binario

  1. #1
    Ciao a tutti, mi chiamo Giorgio e sono alle prese con un progetto in C++. Ho bisogno di memorizzare dei dati (in binario) in un file per poi potervi accedere in un secondo momento. Sono dati strutturati, ovvero più sequenze ognuna del tipo: "informazioneA, informazioneB, ... ". Qualcuno mi aveva parlato di un metodo per farlo e poi accedere ai diversi dati con un puntatore sapendo la struttura del file in questione. E' passato del tempo, quindi non mi ricordo nulla di più preciso, ma sarei davvero grato a chiunque potesse darmi qualche informazione a riguardo.

    Grazie,
    Giorgio

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Puoi usare una struct per i dati e poi memorizzare nel file (usando banalmente delle fwrite). Dal momento che sai la dimensione della struct, ogni record è memorizzato all'offset i*sizeof(struct), con i=0....n
    Per la rilettura basterà la corrispettiva fread dopo una fseek al punto opportuno.

    Talvola può convenire memorizzare in testa un header aggiuntivo contenente il numero di record che seguono ed altre informazioni (ad esempio una signature che identifichi che il file che tratti è proprio del tipo che ti aspetti) anche in questo caso basterà una struct e le classiche fread/fwrite. Ovviamente in caso esista un header il generico record i-esimo sarà alla posizione sizeof(header)+i*sizeof(struct).

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  3. #3
    Quote Originariamente inviato da bottomap Visualizza il messaggio
    Ciao,

    Puoi usare una struct per i dati e poi memorizzare nel file (usando banalmente delle fwrite). Dal momento che sai la dimensione della struct, ogni record è memorizzato all'offset i*sizeof(struct), con i=0....n
    Per la rilettura basterà la corrispettiva fread dopo una fseek al punto opportuno.

    Talvola può convenire memorizzare in testa un header aggiuntivo contenente il numero di record che seguono ed altre informazioni (ad esempio una signature che identifichi che il file che tratti è proprio del tipo che ti aspetti) anche in questo caso basterà una struct e le classiche fread/fwrite. Ovviamente in caso esista un header il generico record i-esimo sarà alla posizione sizeof(header)+i*sizeof(struct).

    Ciaociao

    ciao...è passato del tempo prima che avessi modo di leggere la tua risposta. Ti ringrazio davvero! Potresti farmi un esempio di quello che mi hai consigliato? ...la situazione attuale è questa: ho definito una struct A e un vector<A> che contiene un certo numero di oggetti di tipo A. Con il metodo che mi hai proposto è possibile memorizzare in un file un vettore del genere e poterlo poi recuperare in un secondo momento?

    confido in una tua risposta
    grazie davvero
    ciao

  4. #4
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Si... con buona probabilità si.
    Ricorda ovviamente che una qualsiasi struttura/oggetto contenente dei puntatori non può essere serializzato (memorizzato su file) così com'è... ad ogni esecuzione i valori dei puntatori potrebbero cambiare. Analogamente, se l'oggetto contiene un "contenitore" (uno std:vector ad esempio) dovrai nuovamente serializzarne i singoli elementi.

    Per il resto, supponiamo che la tua struttura contenga un intero ed un float:
    typedef struct { //uso una typedef per non perdere tempo
       int a;
       float f;
    } A;
    
    E che tu abbia uno:
    std::vector<A> vettore;
    
    Potrai memorizzare i valori sequenzialmente, dopo aver aperto il file con una fopen, scorrendo il vector e, data la struct i-esima:
    //PSEUDOCODICE
    A iesima=vettore[i];
    fwrite(&iesima,sizeof(A),1,fp);
    
    Per rileggere (tralasciamo l'header per il momento), l'iesima struct che hai sul file la riottieni con:
    A tmp;
    fseek(fp,i*sizeof(A),SEEK_SET);
    fread(&tmp,sizeof(A),1,fp);
    //... e poi piazzi tmp in un vector
    
    Ovviamente in questo modo devi sapere a priori quanti elementi vai a leggere... un'informazione che potrebbe facilmente fare parte di un eventuale header del file.

    PS:Ci sono dei limiti di base per le operazioni su file (cominci ad ottenere problemi con le funzioni standard quando superi i 4GB), non credo però che si applichi al tuo caso...

    Ciaociao
    Ultima modifica di bottomap; 11-12-2008 21:35 
    ℹ️ Leggi di più su bottomap ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 4
    Ultimo Post: 07-08-2010, 18:21
  2. Risolto: Esportare dati excel - Numeri memorizzati come testo
    Da Gmotta nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 10-03-2010, 22:41
  3. [C/C++] leggere dati da file binario
    Da barraluca73 nel forum C/C++
    Risposte: 6
    Ultimo Post: 07-11-2005, 15:11
  4. File Binario
    Da bornslippy nel forum Visual Basic 6
    Risposte: 10
    Ultimo Post: 08-07-2005, 15:31
  5. File Binario
    Da MaxPower nel forum Visual Basic 6
    Risposte: 8
    Ultimo Post: 10-05-2005, 15:07