Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77

    [C++] Problema Lettura da File ADT vettore

    Buonasera, ho un problema con la funzione lettura da file di un vettore contenenti classi. In sostanza leggo il vettore di oggetti di tipo Lettera presente sul file di testo, dopodich� provo a stampare a video il tutto ma non mi viene mostrato nulla. La funzione � la seguente:
    codice:
    void Vettore::leggifile()
        {
            ifstream file;
            file.open("input.txt");
            
            int i = 0;
            while(!file.eof())
            {
                vet[i]->visualizza_dati(file);
                i++;
            }
            file.close();
        }
    visualizza_dati e' la funzione membro (di tipo void) della classe base Manoscritto e della classe derivata Lettera che legge da file, inoltre nella prima l'ho definita come virtual. Vi posto anche la funzione visualizza_dati della classe Lettera che e' esattamente uguale a quella della classe padre Manoscritto con l'aggiunta della lettura da file delle variabili membro della classe derivata (mittente e destinatario). Questa l'ho testata e funziona senza problemi, la posto perchè non vorrei che funzionasse solo per caso o fortuna e quindi ci fossero problemi logici dietro che chiaramente il compilatore non rileva.
    codice:
    void Lettera::visualizza_dati (ifstream& file)     {
            int buffernum;
            string buffertext;
            
            while(!file.eof())
            {
                
                file >> buffernum;
                set_codice(buffernum);
                
                file >> buffertext;
                set_autore(buffertext.c_str());
                
                file >> buffernum;
                set_numpag(buffernum);
                
                file >> buffertext;
                set_formato(buffertext.c_str());
                
                
    
    
                file >> buffertext;
                set_mittente(buffertext.c_str());
                
                file >> buffertext;
                set_destinatario(buffertext.c_str());
                
            }
            file.close();
        }

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Sicuro che
    codice:
    while(!file.eof())
    e un
    codice:
    file.close()
    in visualizza_dati() vadano bene?
    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
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    provato a toglierli ma continua a non mostrare niente a video e sicuramente il problema non è di quest'ultima visto che precedentemente l'ho testata insieme all'inserimento delle Lettere da tastiera diciamo. La stranezza è che singolarmente la funzione leggi da file va ma poi nell'ambito del contenitore fa qualcosa che non deve fare. Provo a postare l'intera classe contenitore o almeno il file.h tanto per scrupolosità:
    codice:
    #ifndef VETTORE_H
    #define VETTORE_H
    
    
    #include "Manoscritto.h"
    
    
    using namespace std;
    
    
    namespace miospazio
    {
        typedef Manoscritto* T;
        
        class Vettore
        {
            friend ostream& operator<<(ostream&,const Vettore&);
            friend istream& operator>>(istream&, Vettore&);
            private:
                static const int MAX = 10;
                T vet[MAX];
                int riempimento;
                
            public:
                Vettore () {riempimento = 0;}
                Vettore (const int dim) {riempimento = dim;}
                            
                bool empty () const {return riempimento==0;}
                bool full  () const {return riempimento==MAX;}
                
                void bubblesort ();
                bool ricerca (const T&);
                bool push (const T&);
                void inserimento (const T&);        
                void eliminazione (const int);
                void stampavideo();
                
                void stampafile() const;
                void leggifile();
        };    
    }
    #endif

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non hai colto il mio suggerimento (criptico lo ammetto), però tralasciando il fatto che in visualizza_dati() non mandi a video proprio niente (dove sono le cout o le varie printf ? ), stai solo sovrascrivendo i dati di vet[0].
    E quando in visualizza_dati(), il file raggiunge la fine e poi viene chiuso, leggifile() (il suo while(etc...)) non può far altro che uscire.
    Controlla meglio la logica delle due funzioni.
    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
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    Le stampa non le vedi internamente a quelle funzioni perché di questo se ne occupano altre, per esempio nelle classi Manoscritto e Lettera ho fatto l'overloading degli operatori di input e output mentre nella classe Vettore ho una banale funzione di stampa a video composta di un semplice ciclo for. Il fatto è che non capisco perché la funzione leggifile non fa quello che deve fare mentre la funzione stampafile:
    codice:
    void Vettore::stampafile () const
    	{
    		ofstream file;
    		file.open("output.txt");
    	
    		for (int i=0; i<riempimento; i++)
    		{
    			vet[i]->memorizza_dati(file);
    			file << "\n___________________________\n";
    		}
    		file.close();
    	}
    che usa esattamente la stessa identica logica, inclusa la funzione memorizza_dati che è analoga a visualizza_dati ma ovviamente con tutti gli operatori invertiti e ofstream al posto di ifstream, è andata liscia come l'olio al primo colpo. Perché poi sto sovrascrivendo i dati in vet[0]? io ho messo quell'indice "i" proprio per fare in modo che il vettore venga fatto scorrere, cioè l'idea è che vet[i=0] venga messo la prima lettera letta da file e così via.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E quando in visualizza_dati(), il file raggiunge la fine e poi viene chiuso, leggifile() (il suo while(etc...)) non può far altro che uscire.
    che usa esattamente la stessa identica logica
    non è la stessa logica.
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    No allora scusami non capisco dove c'è l'errore di logica, anche per dire che stia sovrascrivendo tutto in vet[0] come dici tu dovrebbe uscirmi per esempio l'ultima lettera presente nel file. Cioè alla fin fine leggifile non fa altro che iterare la funzione visualizza_dati e se quest'ultima fa il suo lavoro non capisco perché ripeterlo tot volte non dovrebbe darmi nessun risultato a video. Perciò, l'errore è in visualizza_dati o in leggifile? perché sulla prima non so che controllare visto che funziona mentre sulla seconda l'ho modificata svariate volte ma il problema comunque rimane lo stesso.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Cioè alla fin fine leggifile non fa altro che iterare la funzione visualizza_dati
    Ok, ma cosa vuoi iterare su un file chiuso?
    Forse ti è sfuggito, ma visualizza_dati() già itera di suo fino a fine file e lo fa su ciò che è contenuto in vet[0] (dato che è questo a richiamare visualizza_dati). Poi quando il file è finito e il bit di eof è impostato a 1, la condizione nel ciclo diventa falsa, il file viene chiuso e visualizza_dati() esce.
    Il controllo torna a leggidati() che incrementa i, controlla il bit di eof() nel ciclo, lo trova a 1, la condizione diventa falsa, esce dal ciclo e chiude il file già chiuso.

    Morale, l'unico elemento usato è vet[0]
    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.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    Okkey chiarissimo e quindi dovrei togliere il while(!file.eof()) e file.close() all'interno di visualizza_dati, in questo modo quando il controllo torno a leggifile la condizione di fine file non è settata e quindi si rimane all'interno del while presente in quest'ultima. Se è questo quello che doveva fare il problema non si è risolto, continua a non stampare nulla e ho pure provato a mettere il ciclo for che stampa vet[i] all'interno della stessa funzione leggifile proprio per stare sul sicuro.

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Meglio se mostri tutto il codice, altrimenti non si va da nessuna parte.
    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.

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.