Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151

    [C++] Serializzazione di un vector

    Salve a tutti.
    Ho la necessità di salvare le informazioni che sono contenute in un vecotr su file.
    Il vector contiene oggetti di una classe da me definita (Om).
    Salvo sul file prima la dimensione del vector e poi con un ciclo il vector stesso.
    Ecco il codice della funzione che salva il file:

    codice:
        
        ofstream outfile("mappa",ios_base::binary);
     
        int dim = mappa->size();
        outfile.write( (char*) (&dim),sizeof(dim) );
        
        vector<Om>::iterator it = mappa->begin();
        while(it!=mappa->end() )
        {
        outfile.write( (char*) (&(*it)), sizeof(Om) );
        it++;
        }
    Per ricostruire il vector leggo prima la dimensione e poi ricostruisco il vector.
    Il codice è:

    codice:
        ifstream inpfile("mappa",ios_base::binary);
    
        int dim=0;
        inpfile.read( (char*) &dim,sizeof(dim));
        
        Om o;
        for(int i=0; i<dim;i++)
        {
            inpfile.read( (char*) &o, sizeof(o) );
            mappa->insert(mappa->end(),o);
        }

    Il problema è che quando vado a leggere il file, il programma va in crash.
    Ho l'impressione che ci sia qualche errore nella funzione che salva il file, qualcuno può darmi delucidazioni?

    Grazie anticipatamente.
    Saluti

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    Mi sono accorto che, prima di crashare, il programma ha letto i primi elementi del vector dal file. Gli interi sono corretti, ovvero ritrovo gli stessi valori che ho salvato, mentre le stringhe sono vuote.

    Se può essere d'aiuto, la classe Om è composta in questo modo:

    codice:
    class Om
    {
        public:
          int riga;         
          int colonna;      
          string colore;   
          int numero;       
          string tipologia; 
          string icona;     
    
          Om(int,int,string,int,string,string);
          Om();
          static bool Compare(Om,Om);
    
          private:
    };
    Il problema sembra essere dovuto ai componenti di tipo string.

    La mia domanda (seconda) domanda ora è questa:
    I vari oggetti di tipo "Om", (credo) avranno dimensioni diverse, in base alla lunghezza delle stringhe.
    Il problema può quindi essere dovuto al fatto di non conoscere la grandezza precisa della classe in lettura?
    Spero di essere stato chiaro.

    Saluti

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Solo i tipi di dato primitivo possono essere serializzati.
    Dovrai cambiare la classe in qualcosa di simile:
    codice:
    const int SIZE(256);
    struct Om
    {
          int riga;         
          int colonna;      
          char colore[SIZE];   
          int numero;       
          char tipologia[SIZE]; 
          char icona[SIZE];     
    };
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    151
    Grazie mille, per la risposta.
    Ho risolto scrivendo sul file "manualmente" ogni membro della classe.

    Per gli interi ho usato queste istruzioni per scrivere:
    codice:
    ...
    outfile.write( (char*) &( (*it).riga  ), sizeof ( (*it).riga) );
    ...
    mentre per leggere:

    codice:
    ...
    Om o;
    inpfile.read( (char*) (&(o.riga) ), sizeof(o.riga) );
    ...
    Per quanto riguarda le stringhe, ho sfruttato i caratteri di formattazione: ho scritto in questo modo:

    codice:
    ...
    outfile << (*it).colore <<endl;
    ...
    e letto così:
    codice:
    ...
    Om o;
    getline(inpfile,o.colore);
    ...
    Saluti

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 © 2024 vBulletin Solutions, Inc. All rights reserved.