Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Leggere/scrivere vector in file
Forum - C/C++ - Leggere/scrivere vector in file

Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 18:16
Sabato, 19/04/2014
Ciao a tutti, ho un ulteriore problemino nel mio progetto.
Dunque... io ho un vector fatto in questo modo:
Codice sorgente - presumibilmente Plain Text

  1. vector<classe> lista;


vorrei sapere come poterlo scrivere e leggere da file 8-|

Ultima modifica effettuata da bububs il 19/04/2014 alle 18:53


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:39
Sabato, 19/04/2014
Usa gli stream del C++ ... quale difficoltà hai?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 23:31
Sabato, 19/04/2014
Io ho "creato" attraverso gli spunti presi in giro queste due funzioni.. mi crea il file pero' la lettura ha sempre esito negativo :_doubt:
Codice sorgente - presumibilmente C/C++

  1. void loadLista(vector<amico>& list){
  2.     ifstream readFile;
  3.     readFile.open("file.bin", ios::in | ios::binary);
  4.     readFile.read( (char*)&list, sizeof(list) );
  5. }
  6.  
  7. void writeLista(vector<amico> list){
  8.     ofstream writeFile;
  9.     writeFile.open("file.bin", ios::out | ios::binary);
  10.     if ( !list.empty() )
  11.         writeFile.write( (char*)&list[0], list.size() * sizeof(amico) );
  12. }



Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 23:54
Sabato, 19/04/2014
Non puoi scrivere in un file binario il contenuto di un container di classi dato che ci saranno sicuramente puntatori che, in lettura, non saranno validi.

Ti consiglio di implementare un metodo per la serializzazione di un elemento della classe e utilizzarlo iterando tutti gli elementi del vector in un file di testo.

Un vector di elementi di una certe classe non è equivalente ad una sequenza in memoria di tali elementi.

Ultima modifica effettuata da nessuno il 19/04/2014 alle 23:59


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 2:31
Domenica, 20/04/2014
Purtroppo non abbiamo ancora affrontato l'argomento della serializzazione e non penso lo faremo... xò lo volevo utilizzare per comodità e velocità.. non è che mi spiegheresti come fare?


P.S. se non dovessi capire cio' sarei costretto a gestirli senza serializzazione delle classi ma attraverso le stringhe dei valori.


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 12:31
Domenica, 20/04/2014
La serializzazione è un concetto molto semplice e molto importate perché ti permette di "salvare" (tra poco capirai perché tra virgolette) un istanza di una classe.
Consiste nel prelevare tutti i dati dalle variabili che caratterizzano la distinzione tra due istanze di una stessa classe e convertirli in byte (se vuoi andare a scrivere un file binario) o mantenere il valore com'è e portarsi dietro il tipo (se vuoi andare a scrivere un file XML).

Binario: se non ti interessa che sia possibile la manipolazione da parte di un essere umano o se devi passare i dati attraverso uno stream
XML: esattamente il contrario

Queste sono solo le conversioni più usate ma puoi dettare tu un nuovo "protocollo".

Vediamo un esempio...
Codice sorgente - presumibilmente C++

  1. class Foo {
  2.   int a;
  3.   int b;
  4.  
  5.   int *c;
  6.  
  7.   int A {
  8.     get{return this.a;}
  9.     set{this.a = value;}
  10.   }
  11.   int B {
  12.     get{return this.b;}
  13.     set{this.b = value;}
  14.   }
  15. }


Vediamo subito che nella nostra bella classe Foo abbiamo solo a e b che ne determinano l'unicità, c è un puntatore, quando andremo a ripristinare la nostra istanza è improbabile che il dato a cui puntava c sia ancora nella stessa posizione, A e B sono invece proprietà che non portano con se dati propri ma fanno riferimento alle variabili a e b. Pertanto capiamo subito che per salvare lo "stato" di un istanza di Foo dobbiamo scriverci da qualche parte i soli valori a e b, per poi, in caso andremo a ricreare la nostra istanza di Foo recupereremo e riscriveremo al posto giusto cioè a e b.

In C++ non so se esistono delle funzioni già fatte che permettano la serializzazione di una classe come in .NET, ma in ogni caso, a mio avviso, è bene scrivere i metodi che permettono serializzazione e de serializzazione di tasca propria.

Analizziamo (solo) il caso Binario, io consiglio di impostare la nostra classe con un metodo Serialize che restituisca un array di byte facile da scrivere in un file di testo, quindi prendiamo la variabile a, la convertiamo in array di byte e facciamo lo stesso con b, uniamo i due array e li restituiamo, ora all'esterno della classe possiamo fare diverse operazioni, scriverlo su un file binario, inviarlo attraverso socket, scriverlo in un database, ecc...

Per recuperare l'istanza invece dobbiamo crearci un costrutto della classe Foo che accetti un array di byte e si occupi di rigenerare l'istanza, quindi andiamo a leggere il nostro file preleviamo il numero di byte che ci occorrono in questo caso sizeof(int)*2 e li passiamo a Foo(byte[] b) ora il nostro costrutto dovrà fare le operazioni inverse di Serialize leggera quanti byte compongo la prima variabile, li preleverà dalla nostra matrice b e la ripristinerà e via cosi per tutte le variabili.

Ho cercato di buttarti li i concetti base, se non dovessi capire qualcosa chiedi pure e vedremo di far luce sui tuoi dubbi ;)


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 20:36
Lunedì, 21/04/2014
Grazie intanto della spiegazione Roby :k:
Allora io ho capito il concetto che sta dietro a quello che hai spiegato ma "praticamente" non capisco come si possa attuare. Ho fatto alcune ricerche per convertire variabili in array di byte ma non ci ho capit oassolutamente nulla :d
Percio' se hai tempo da dedicarmi ne sarei ben felice :rofl:


Parte della disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.  [cit. Isaac Asimov]
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:54
Lunedì, 21/04/2014
Beh è un concetto molto flessibile, diciamo.
Allora l'unico dato che puoi dare per certo è che il char è un solo byte, quindi per convertire un char non è necessaria nessuna operazione particolare, per convertire una stringa la storia non cambia, essendo un array di char può essere paragonato ad un array di byte senza troppe complicanze.
Il problema sta in tutto il resto... devi andare di sizeof e verificare quanti byte occupino le varie variabili e poi trovare il metodo appropriato per convertirle in array di byte, non credo che sia difficile reperire funzioni già fatte in rete ;)


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote