Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C++] Domanda sulla scrittura su file binario

    Salve a tutti, da un po di giorni ho questo dubbio, nella funzione write() per scrivere un membro di un oggetto su file, perchè devo convertire in carattere l'indirizzo? o se non si fa cosi come posso fare per salvare su file binario un oggetto di una classe?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Salve a tutti, da un po di giorni ho questo dubbio, nella funzione write() per scrivere un membro di un oggetto su file, perchè devo convertire in carattere l'indirizzo?
    Semplice: perché lo richiede la funzione.
    o se non si fa cosi come posso fare per salvare su file binario un oggetto di una classe?
    Qui la cosa si fa complicata. In generale non è possibile salvare un oggetto (inteso come oggetto C++) in modo binario in un file come si farebbe con una struttura stile C. E anche li occorre sapere se tale struttura contiene puntatori.
    Come linea guida puoi salvare in formato binario: char, int, float, double, strutture composte dai precedenti, ma non puntatori o strutture che ne contengano (inclusi oggetti C++) in quanto verrebbe salvato l'indirizzo del puntatore ma non quello a cui punta. Indirizzo che in in caso di rilettura da file sarebbe non valido.
    Per scrivere oggetti C++ (o comunque contenenti puntatori) occorre un metodo un po' più sofisticato: la serializzazione.
    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.

  3. #3
    ok, io volevo salvare su file un oggetto scrivendo una funzione che salvasse i vari membri e poi ricomporli nella funzione complementare di lettura, per quanto riguarda puntatori, come posso fare per la serializzazione? trovo su internet qualche buona documentazione?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per quanto riguarda il concetto di serializzazione, puoi leggere qui:
    https://isocpp.org/wiki/faq/serialization
    http://www.ocoudert.com/blog/2011/07...serialization/

    io volevo salvare su file un oggetto scrivendo una funzione che salvasse i vari membri e poi ricomporli nella funzione complementare di lettura
    tuttavia sei sulla buona strada. Per quanto riguarda i puntatori: se sono puntatori (array) scrivi su file prima la dimensione dell'array, poi l'array stesso. Se sono puntatori a oggetti, applichi la cosa ricorsivamente. Tieni solo presente che in formato binario quello che poi entra sono solo byte e se nella funzione di ricostruzione sbagli la dimensione da leggere crolla tutto.
    Meglio se posti un oggetto sce vorresti scrivere, così almeno si discute su qualcosa di concreto.
    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.

  5. #5
    ok, allora stasera rispondo con l'oggetto da scrivere su file per avere un confronto.

  6. #6
    ho caricato tutto quello che ho fatto su https://github.com/Giusepp3/class-pacco devo solo completare la funzione leggi da file della classe e poi alcune funzioni nella pila, ma mi serve aiuto solo sulla funzione per leggere da file del file class_pacco.

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    w_ind puoi modificarla così:
    codice:
        void pacco::w_ind(ofstream & of)const{
                of.write(indirizzo,strlen(indirizzo));
        }
    poi vedendo come è fatta save_bin, l'ordine di lettura dev'essere rispettato.
    Un funzione load_bin sarà più o meno fatta così.
    codice:
        if.read((char*)&codice,sizeof(codice));
        if.read((char*)&peso,sizeof(peso));
        if.read((char*)&len,sizeof(len));
        // poi il puntatore 
        indirizzo = new char[len+1];
        if.read((char*(indirizzo),len)
        indirizzo[len] = '\0';
    Domanda, non puoi usare std::string invece dei char* per le stringhe?
    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.

  8. #8
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Domanda, non puoi usare std::string invece dei char* per le stringhe?
    magari potessi, finché devo fare questi programmi per esercitarmi per l'università devo utilizzare char*, poi dopo utilizzerò string ovviamente!

    comunque la funzione che avevo fatto io w_ind scriveva elemento per elemento della stringa, non sapevo si potesse passare direttamente il puntatore e scrivesse automaticamente!

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Nel caso di array si. Ovviamente la dimensione di scrittura va moltiplicata per la dimensione del dato da scrivere
    codice:
    int abc[4] = {0,1,2,3}
    of.write((char*)abc, 4 * sizeof(int));
    Ultima modifica di shodan; 17-01-2017 a 19:59 Motivo: corretto refuso
    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.

  10. #10
    ok ok grazie mille!

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.