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

    Problema caricamento da File! C++

    Salve gente purtroppo ho un problema con il caricamento da File nel mio programma che realizza una libreria.
    Vi spiego cosa avviene, una volta che salvo su File una Casa Editrice con i seguenti campi:
    Nome, Iva, Telefono, Fax, questi 4 campi fanno parte della classe Casa_Ed mentre indirizzo e Codice Casa Editrice fanno parte di altre due classi separate, effettuo l'overload degli operatori >> e << in questo modo:

    friend istream &operator>>(istream &stream, Casa_Ed &obCasa_Ed);
    friend ostream &operator<<(ostream &stream, Casa_Ed obCasa_Ed);

    Sembra che il salvataggio su File avvenga in modo corretto, il problema sorge una volta che il file viene CARICATO.
    Quando viene caricato il file, il campo Nome viene saltato, come se non leggesse nulla infatti viene messo questo "", nel campo Iva viene messo in Nome e quindi viene tutto scalato.

    Non riesco a capire il problema qualcuno di voi saprebbe darmi una spiegazione?

    codice:
    /*OVERLOAD OPERATORI*/
    
    istream &operator>>(istream &stream, Casa_Ed &obCasa_Ed)
    {
    	obCasa_Ed.Inizializzatore();
    
    	char str[100]="\0";
    	
    	stream.getline(str,99);
    	obCasa_Ed.Nome=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Nome, str);
    
    	stream.getline(str,99);
    	obCasa_Ed.Iva=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Iva, str);
    
    	stream.getline(str,99);
    	obCasa_Ed.Telefono=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Telefono, str);
    
    	stream.getline(str,99);
    	obCasa_Ed.Fax=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Fax,str);
    
    	stream >> obCasa_Ed.ind;
    	stream >> obCasa_Ed.Cd;
    
    	return stream;
    
    }
    
    ostream &operator<<(ostream &stream, Casa_Ed obCasa_Ed)
    {
    	stream << obCasa_Ed.Nome << "\n";
    	stream << obCasa_Ed.Iva <<"\n";
    	stream << obCasa_Ed.Telefono << "\n";
    	stream << obCasa_Ed.Fax << "\n";
    	stream << obCasa_Ed.ind << "\n";
    	stream << obCasa_Ed.Cd << "\n";
    
    	return stream;
    }
    
    
    //SALVASU FILE
    template<int Q>
    void Biblioteca<Q>::Salva() const
    {
    	int i;
    	char str[100];
    
    	cout<<"\nSalvataggio Biblioteca NOME: ";
    	cin.getline(str, 99);
    
    	ofstream out(str, ios::out | ios::binary | ios::app);
    
    	if(!out){
                  cout<<"IMPOSSIBILE APRIRE IL FILE\n";
                  exit(EXIT_FAILURE);
                  }
    
    	out<< Casa << "\n";
    	out<< Vol <<"\n";
    
    	for(i=0; i<Casa; i++) out << ArrayCasa[i] << "\n";
    
    	VolQDisp *x=Lista_Vol;
    
    	for(i=0; i<Vol; i++)
    	{
    		out << ArrayVolume[i] << "\n";
    		if(x!=0){
    		out << x->isbn << "\n";
    		out << x->q << "\n";
    
    		x=x->prox;}
    	}
    
    	out.close();
    	cout << "\nSALVATAGGIO COMPLETATO";
    
    }
    
    //CARICAMENTO DA FILE
    template<int Q>
    void Biblioteca<Q>::Carica()
    {	
    	char str[100]="\0";
    	int i, Q;
    	ISBN Isbn;
    
    
    	cout<<"\nCarica la Biblioteca, NOME FILE: ";
    	cin.getline(str,99);
    
    	ifstream in(str, ios::in | ios::binary);
    
    	if(!in){
                  cout<<"IMPOSSIBILE APRIRE IL FILE\n";
                  exit(EXIT_FAILURE);
                  } 
    	in>> Casa;
    	in>> Vol;
    
    	for(i=0; i<Casa; i++) in >> ArrayCasa[i];
    
    	for(i=0; i<Vol; i++) {
    		in >> ArrayVolume[i];
    		in >> Isbn;
    		in >> Q;
    		}
    
    		in.close();
    		cout<<"\nCARICAMENTO EFFETTUATO";
    	
    	}

  2. #2
    Nessuno che sa dirmi come risolvere il problema?

  3. #3
    possibile che nel file la prima riga sia vuota?

    EDIT:
    Comunque, se recludi a priori la possibilità che un campo sia una stringa vuota e sai per certo che ci deve essere scritto qualcosa in ogni riga, puoi mettere un controllo e risolvi il problema alla radice
    codice:
    istream &operator>>(istream &stream, Casa_Ed &obCasa_Ed)
    {
    	obCasa_Ed.Inizializzatore();
    
    	char str[100]="\0";
    	
            while( str è vuota )
            	stream.getline(str,99);
    	obCasa_Ed.Nome=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Nome, str);
    [...]
    }

  4. #4
    Il problema è proprio questo, che aprendo il file con un editor di testo, non ricavo una riga vuota, c'è qualcosa che mi sfugge, potrei provare a mettere un controllo, ma sarebbe una scappatoia vorrei capire cosa invece succede.


    Grazie della risposta.

  5. #5
    Ho provato a mettere questo controllo ma non va, praticamente in ciclo continua spazzolandosi tutto il File e non esce mai.

    codice:
    istream &operator>>(istream &stream, Casa_Ed &obCasa_Ed)
    {
    	obCasa_Ed.Inizializzatore();
    
    	char str[100]="\0";
    	do{
            stream.getline(str,99);
    	obCasa_Ed.Nome=new char [strlen(str)+1];
    	strcpy(obCasa_Ed.Nome, str);
           };while(str!="")
    [...]
    }

  6. #6
    allora guarda io per i parser uso sempre una classe Token, che mi restituisce solo "un pezzo" (un token appunto).
    codice:
    /*************************************************************************
    ** Each piece of information we want to read is on its own line			**
    ** which means we need to write code that can parse lines of text		**
    ** from a file and break down the lines into smaller pieces of text.	**
    ** These smaller pieces of text are called tokens.						**
    ** This class can return to use tokens from within a text file.			**
    **************************************************************************/
    Ti do l'input e se ti piace puoi provare ad implementare il tuo sistema in questo modo.
    Io imparai a fare così da un libro che ho studiato sulle DirectX.
    Non trovo purtroppo miei pezzi di codice semplici da poterti incollare qui , però ho trovato una interessante discussione a riguardo su stackoverflow

    codice:
    #include <iostream>
    #include <fstream>
    
    class Token
    {
        private:
            friend std::ostream& operator<<(std::ostream&,Token const&);
            friend std::istream& operator>>(std::istream&,Token&);
            std::string     value;
    };
    std::istream& operator>>(std::istream& str,Token& data)
    {
        // Check to make sure the stream is OK.
        if (!str)
        {   return str;
        }
    
        char    x;
        // Drop leading space
        do
        {
            x = str.get();
        }
        while(str && isspace(x) && (x != '\n'));
    
        // If the stream is done. exit now.
        if (!str)
        {
            return str;
        }
    
        // We have skipped all white space up to the
        // start of the first token. We can now modify data.
        data.value  ="";
    
        // If the token is a '\n' We are finished.
        if (x == '\n')
        {   data.value  = "\n";
            return str;
        }
    
        // Otherwise read the next token in.
        str.unget();
        str >> data.value;
    
        return str;
    }
    std::ostream& operator<<(std::ostream& str,Token const& data)
    {
        return str << data.value;
    }
    
    
    int main()
    {
        std::ifstream   f("PLOP");
        Token   x;
    
        while(f >> x)
        {
            std::cout << "Token(" << x << ")\n";
        }
    }

  7. #7
    mmm non mi è molto chiara la cosa, ma cercherò di capire un po come dirigermi

  8. #8
    Allora il problema si ha quando legge CASA e VOL dal File, questi sono interi, ho risolto utilizzando questa funzione:

    codice:
    void in_num(istream &stream, unsigned int &n) { 	
    char buf[80];  	
    stream.getline(buf, 79); 	
    n = atoi(buf); }

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.