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

    [C++] Domanda sulla scrittura su file binario di una pila

    Ciao a tutti, potete consigliarmi come fare la funzione leggi_bin() della classe pila? dovrei fare in modo che legga l'intera pila da file binario, ho dotato ogni oggetto della pila di un metodo per leggere da file binario (forse ho sbagliato a fare cosi), ma non riesco a fare in modo da continuare a leggere il secondo oggetto perchè ogni volta che apro un il file torna dall'inizio.
    Anche se non so come scriverla ho due idee:

    1) utilizzare il puntatore a file e spostarlo di sizeof(o) dove o è l'oggetto della pila, anche se è una cosa un po complicata...

    2) modificare la funzione che legge da binario e passare per parametro lo stream, in questo modo non chiudo il file, ma dovrò dotare l'oggetto di un nuovo metodo per leggere da file.

    quale mi consigliate tra le due, o come fareste voi? potete realizzare un prototipo?

    vi allego tutto il progetto, lo potete trovare qui: https://github.com/Giusepp3/class-pacco

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Passa lo stream per reference alle funzioni save_bin, read_bin della classe pacco.
    Tra l'altro nella funzione pacco::read_bin non hai bisogno di variabili temporanee per recuperare i dati dal momento che disponi delle variabili membro per farlo.
    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
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Tra l'altro nella funzione pacco::read_bin non hai bisogno di variabili temporanee per recuperare i dati dal momento che disponi delle variabili membro per farlo.
    si ma in questo modo non utilizzo le funzioni set, che sono private e gestite da una funzione edit per un eventuale controllo sulla validità dei membri che non è specificato però nella traccia.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E quindi? Niente ti impedisce di usare le funzioni set per fare controlli ulteriori se ne hai bisogno. Funzioni che tra l'altro non usi mai (vedi costruttori vari e operatori di assegnamento)

    Quello che ti sto facendo notare è che hai già delle variabili membro della dimensione giusta, per cui puoi tranquillamente fare così:
    codice:
    void pacco::read_bin(const char* filebin) throw(err){
        ifstream in;
        in.open(filebin, ios::in | ios::binary);
        if(in.fail()) throw err("errore nell'apertura del file", "posta::pacco::read_bin()");
        int len;
        char* ind;
        in.read((char*)&codice,sizeof(cod));
        in.read((char*)&peso,sizeof(pes));
        in.read((char*)&len,sizeof(len));
        indirizzo = new char [len+1];
        in.read(ind,len);
        ind[len]='\0';
        set_cod(codice); // eventuale controllo
        set_pes(peso); // eventuale controllo
        set_ind(ind); // memory leaks qui
        in.close();
    }
    osserva la funzione pacco::set_ind() e dimmi quando deallochi la memoria assegnata a ind. E dimmi la funzione che eventualmente ne deve gestire il lifetime.
    Ultima cosa: il distruttore dov'è? Quando pacco esce dallo scope, chi libera la memoria assegnata a indirizzo?
    E in pila? Se dovessero rimanere dei nodi allocati in pila, chi ne libera la memoria quando un oggetto pila esce dallo scope?
    Immagina siano queste le domande poste da chi ti ha assegnato la traccia e che valgono per ogni classe dove allochi memoria.
    In C++ la gestione della memoria è un aspetto critico ed è la prima cosa che deve saltare all'occhio.
    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
    hai ragione me ne ero completamente scordato del distruttore! stasera quando torno a casa controllo subito e aggiorno il codice! Grazie mille, avevo preso una svista enorme!!

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.