[c++]memorizza su file

di il
10 risposte

[c++]memorizza su file

Ciao a tutti... ho un problema con un esercizio ...mi compila finquanto nn chiamo la funzione della pila template memorizzasufile.... vi posto la mia soluzione come posso risolvere?
   Pila <int>A;
int a=5, b=6, c=7;
A.push(a);
A.push(b);
A.push(c);
A.stampa();
A.memorizzasufile("a.txt");
try{
A.pop(a);
}
catch(string){
cout<<"\n Errore! stai tentato di estrarre una pila vuota"<<endl;
}
}

fino a stampa va poi va in errore...
  //stampa pila
 template <class T>
 void Pila<T>::stampa()const{
 		P temp=testa;
 		while(temp){
 			cout<<temp->elem<<' '<<endl; 
 			temp=temp->succ;
 		}
 }
 
 //stampa su file
 template <class T>
 bool Pila<T>:: memorizzasufile(const char * filepath){
 	ofstream outfile; //dichiaro una variabile ofstream
 	outfile.open(filepath); //apro il file
 	if(!outfile) return false;
 	else{
 		P temp=testa;
 		while(temp){
 			outfile<<temp->elem<<endl;
 			temp=temp->succ;
 		}
 	
 	outfile.close(); //chiudo il file
 	return true;
 }
 }
 

10 Risposte

  • Re: [c++]memorizza su file

    "Compila" o "esegue" fino a ... ?

    Hai errori in compilazione o in esecuzione ? C'è differenza ...
  • Re: [c++]memorizza su file

    Eh hai ragione la compilazione nn da problemi...e durante l'esecuzione che va in blocco...
  • Re: [c++]memorizza su file

    Ho provato anche a farla void
      void memorizzasufile(); 
       //stampa su file
     template <class T>
     void Pila<T>:: memorizzasufile(){
     	ofstream outfile; //dichiaro una variabile ofstream
     	outfile.open("documenti.txt", ios::out); //apro il file
     	if(!outfile) cout<<"\n Errore"<<endl;
     	else{
     		P temp=testa;
     		while(temp){
     			outfile<<temp->elem<<endl;
     			temp=temp->succ;
     		}
     	
     	outfile.close(); //chiudo il file
     
     }
     }
    
    Ma niente
  • Re: [c++]memorizza su file

    "va in blocco" non significa nulla.

    Errore? Quale e dove?
  • Re: [c++]memorizza su file

    Se specificava un errore me lo risolvevo da me...va in blocco nel senso che mi da la schermata con i numeri di a,b,c cioè
    7
    6
    5

    e subito dopo la schermata di errore solita di windows che dice :
    Progetto1.exe
    Si è verificato un errore in Progetto1.exe.L'applicazione verrà chiusa.
    Potrebbe essersci verificata la perdita dei dati su cui si stava lavorando ecc ecc ecc....
    [invia segnalazione][Non Inviare]
  • Re: [c++]memorizza su file

    alilife ha scritto:


    se specificava un errore me lo risolvevo da me...
    Quando si ricevono certe risposte verrebbe voglia di non dare più alcuna indicazione ...

    Se ti chiedo quale errore ottieni e che "va in blocco" non vuol dire molto, dovresti chiederti se c'è qualcosa che ti sfugge, magari perché non la conosci ... La "schermata di errore solita di Windows" non è una schermata messa lì tanto per essere ignorata ma per *essere letta*!
    Quello è l'errore di cui mi interessa conoscere i dettagli perché si possono leggere i dettagli ...

    In ogni caso, non ho capito se il file comunque è stato scritto completamente. Se vuoi postare anche la classe in modo da compilare completamente il codice, allora lo proverò per replicare l'errore.
  • Re: [c++]memorizza su file

    Ok scusa ma non volevo esser scortes...nn è da me... ti posto tutto il codice che ho fatto e te ne sarei grat se mi risolv il problema.grazie
      /*La classe Libro contiene le seguenti variabili 
    membro:
    -	Autore: (stringa allocata dinamicamente)
    -	Titolo : (stringa allocata dinamicamente)
    -	numpp: numero di pagine  (intero)
    Le classi devono prevedere gli opportuni costruttori, e devono gestire 
    correttamente l'estensione dinamica fornendo le opportune funzionalità. 
    Devono inoltre fornire l'overloading degli operatori di flusso << e >> 
    
    */
    
    #ifndef LIBRO_H_
    #define LIBRO_H_
    #include <iostream>
    #include <cstring>
    #include <fstream>
    using namespace std;
    
    class Libro{
    		friend ostream& operator<<(ostream&,const Libro&);
    		friend istream& operator>>(istream&, Libro&);
    	protected:
    		char* Autore;
    		char* Titolo;
    		int numpp;
    	public:
    		Libro(): Autore(""), Titolo(""), numpp(0){} //costruttore senza argomenti
    		Libro(const char*A="", const char* T="", const int N=0); //costruttore con argomenti
    		virtual ~Libro(){delete[]Autore; delete[]Titolo;} //distruttore
    		Libro(const Libro&); //costruttore di copia
    		
    		//funzioni get e set
    		char* getAutore()const{return Autore;}
    		char* getTitolo()const{return Titolo;}
    		int getNumpp()const{return numpp;}
    		
    		void setAutore(const char*);
    		void setTitolo(const char*);
    		void setNumpp(const int N){numpp=N;}
    		
    	
    		const Libro&operator=(const Libro&);
    	
    		 
    };
    
    #endif
      //implementazione classe libro
    
    #include "libro.h"
    
    //costruttore con argomenti
    Libro::Libro(const char*A, const char*T, const int N){
    	Autore=new char[strlen(A)+1];
    	strcpy(Autore, A);
    	Titolo=new char[strlen(T)+1];
    	strcpy(Titolo,T);
    	numpp=N;
    }
    
    //costruttore di copia
    Libro::Libro(const Libro&L){
    	Autore=new char[strlen(L.Autore)+1];
    	strcpy(Autore, L.Autore);
    	Titolo=new char [strlen(L.Titolo)+1];
    	numpp=L.numpp;
    }
    
    //set autore
    
    void Libro::setAutore(const char* A){
    	delete[]Autore;
    	Autore=new char[strlen(A)+1];
    	strcpy(Autore, A);
    }
    
    //set titolo
    void Libro::setTitolo(const char*T){
    	delete[]Titolo;
    	Titolo=new char[strlen(T)+1];
    	strcpy(Titolo,T);
    }
    
    //operatore =
    const Libro&Libro::operator=(const Libro&L){
    	if(this!=&L){
    		if (Autore)delete[]Autore;
    		Autore=new char[strlen(L.Autore)+1];
    		strcpy(Autore, L.Autore);
    		if(Titolo)delete[]Titolo;
    		Titolo=new char[strlen(L.Titolo)+1];
    		strcpy(Titolo, L.Titolo);
    		numpp=L.numpp;
    		
    	}
    	return *this;
    }
    
    
    //operator <<
    ostream&operator<<(ostream&out, const Libro&L){
    	
    	out<<"\n autore del libro:"<<L.Autore<<endl;
    	out<<"\n Titolo del libro:"<<L.Titolo<<endl;
    	out<<"\n numero pagine del libro:"<<L.numpp<<endl;
    	return out;
    }
    
    //operatore >>
    istream&operator>>(istream&in, Libro&L){
    	char buff1[20];
    	in.ignore();
    	cout<<"\n autore del libro:"<<endl;
    	in.getline(buff1,20);
    	L.setAutore(buff1);
    	char buff2[20];
    	cout<<"\n titolo del libro:"<<endl;
    	in.getline(buff2,20);
    	L.setTitolo(buff2);
     	cout<<"\n numero di pagine:"<<endl;
     	int n;
     	in>>n;
     	L.setNumpp(n);
    	return in;
    }
    
      //eccezione No_Item
    
    #ifndef NO_ITEM_H_
    #define NO_ITEM_H_
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    
    class NO_Item{
    	private:
    		string msg;
    	public:
    		NO_Item():msg("Errore! stai tentato di estrarre una pila vuota"){}
    		const string what()const{return msg;}
    };
    #endif
    
      /*La  pila è realizzata mediante una classe template ed è rappresentata mediante
     lista a puntatori.
    La funzione membro pop lancia una eccezione nel caso si tenti di estrarre da 
    una pila vuota.
    L'eccezione, di tipo NO_Item, è definita dallo studente. 
    La sessione di scrittura su file viene gestita dalla classe pila, che definisce 
    la variabile di tipo stream. 
    */
    #ifndef PILA_H_
    #define PILA_H_
    #include <iostream>
    #include <fstream>
    #include "NO_item.h"
    
    using namespace std;
    
    
    template <class T> class Pila;
    
    //template nodo
    template<class T> class Nodo{
    	friend class Pila<T>;
    	private:
    		T elem;
    		Nodo<T>* succ;
    	public:
    		Nodo(): elem(0),succ(0){}
    };
    
    //template pila
    template <class T> class Pila{
    	typedef Nodo<T> *P; //puntatore al nodo
    	
    	private:
    		P testa;
    	public:
    		Pila(){testa=0;} //costruttore
    		~Pila(){clear();} //distruttore
    		
    		void push(const T&);
    		void pop(T&) throw (NO_Item);
    		void top(T&)const;
    		bool empty(){return testa==0;}
    		bool full()const{return false;}
    		void clear();
    		void stampa()const;
    		void memorizzasufile();
    		//bool memorizzasufile(const char * filepath);
    };
    
    #endif
    //implementazione
    
    //push
    template <class T>
    void Pila<T>::push(const T&e){
    	P q=new Nodo<T>;
    	q->elem=e;
    	q->succ=testa;
    	testa=q;
    }
    
    //pop
    template <class T>
    void Pila<T>::pop(T&e)throw (NO_Item){
    	if(empty()) throw (NO_Item());
    	else{
    	
    	e=testa->elem;
    	P q=testa;
    	testa=testa->succ;
    	delete q; 
    }
    }
    
    //top
    template<class T>
    void Pila<T>::top(T&e)const{
         e=testa->elem;
     }
     
     //clear
     template <class T>
     void Pila<T>::clear(){
     	P temp;
     	while(temp){
     		temp=testa;
     		testa=testa->succ;
     		delete temp;
     	}
     }
     
     //stampa pila
     template <class T>
     void Pila<T>::stampa()const{
     		P temp=testa;
     		while(temp){
     			cout<<temp->elem<<' '<<endl; 
     			temp=temp->succ;
     		}
     }
     /*
     //stampa su file
     template <class T>
     bool Pila<T>:: memorizzasufile(const char * filepath){
     	ofstream outfile; //dichiaro una variabile ofstream
     	outfile.open(filepath); //apro il file
     	if(!outfile) return false;
     	else{
     		P temp=testa;
     		while(temp){
     			outfile<<temp->elem<<endl;
     			temp=temp->succ;
     		}
     	
     	outfile.close(); //chiudo il file
     	return true;
     }
     }
    */
    
    
     //stampa su file
     template <class T>
     void Pila<T>:: memorizzasufile(){
     	ofstream outfile; //dichiaro una variabile ofstream
     	outfile.open("documenti.txt", ios::out); //apro il file
     	if(!outfile) cout<<"\n Errore"<<endl;
     	else{
     		P temp=testa;
     		while(temp){
     			outfile<<temp->elem<<endl;
     			temp=temp->succ;
     		}
     	
     	outfile.close(); //chiudo il file
     
     }
     }
    
    
      //classe testo che deriva da libro
    
    /*La classe Testo aggiunge le variabili membro:
    -	Corso: corso universitario in cui è adottato  (stringa allocata dinamicamente)
    -	Serie: ad esempio Computer Science, Medicina, etc. : (stringa allocata dinamicamente)
    */
    
    #ifndef TESTO_H_
    #define TESTO_H_
    #include "libro.h"
    #include <fstream>
    
    class Testo:public Libro{
    	private:
    		char* Corso;
    		char* Serie;
    	public:
    		Testo(const char*A="", const char*T="", const int N=0, const char*C="", const char*S=""); //costruttore con argomenti
    		~Testo(){delete[]Corso; delete[]Serie;}
    		Testo(const Testo&);
    		
    		//get e set
    		char* getCorso()const{return Corso;}
    		char* getSerie()const{return Serie;}
    		
    		void setCorso(const char*);
    		void setSerie(const char*);
    		
    		//operatori =,<< e >>
    		const Testo&operator=(const Testo&);
    		friend ostream& operator<<(ostream&, const Testo&);
    		friend istream& operator>>(istream&, Testo&);
    		
    		//scrittura su file
    	//	friend ofstream&operator<<(ofstream&, const Testo&);
    
    	
    };
    
    #endif
    
      //implementazione classe testo
    
    #include "testo.h"
    
    //costruttore con argomenti
    Testo::Testo(const char*A, const char*T, const int N, const char*C, const char*S):
    	Libro(A,T,N){
    		Corso=new char[strlen(C)+1];
    		strcpy(Corso, C);
    		Serie=new char[strlen(S)+1];
    		strcpy(Serie, S);
    	}
    	
    //costruttore di copia
    Testo::Testo(const Testo&T): Libro(T){
    	delete[]Corso;
    	Corso=new char[strlen(T.Corso)+1];
    }
    
    //set corso
    void Testo::setCorso(const char*C){
    	Corso=new char[strlen(C)+1];
    	strcpy(Corso,C);
    }
    
    //set Serie
    void Testo::setSerie(const char*S){
    	Serie=new char[strlen(S)+1];
    	strcpy(Serie, S);
    }
    
    //operatore =
    const Testo & Testo::operator=(const Testo&T){
    	if(this!=&T){
    		Libro::operator=(T);
    		if(Corso)delete[]Corso;
    		Corso=new char[strlen(T.Corso)+1];
    		strcpy(Corso, T.Corso);
    		if(Serie)delete[]Serie;
    		Serie=new char[strlen(T.Serie)+1];
    		strcpy(Serie, T.Serie);
    	}
    	return *this;
    }
    
    //operatore <<
    ostream& operator<<(ostream&out, const Testo &T){
    	out<<*(Libro*)(&T);
    	out<<"\n corso:"<<T.Corso<<endl;
    	out<<"\n Serie:"<<T.Serie<<endl;
    	return out;
    }
    
    //operatore >>
    istream& operator>>(istream&in, Testo&T){
    	in >> * (Libro*)(&T);
    	char buff1[20];
    	in.ignore();
    	cout<<"\n corso:"<<endl;
    	in.getline(buff1,20);
    	T.setCorso(buff1);
    	char buff2[20];
    	cout<<"\n serie:"<<endl;
    	in.getline(buff2,20);
    	T.setSerie(buff2);
    	return in;
    }
    
    
    
    
     #include <iostream>
    #include "pila.h"
    #include "libro.h"
    
    /* run this program using the console pauser or add your own getch, system("pause") or input loop */
    
    int main(int argc, char *argv[]) {
    /*	
    	Pila <int>A;
    	int a=5;
    	A.push(a);
    	A.stampa();*/
     
    	//prova template pila
    	
    Pila <int>A;
    int a=5, b=6, c=7;
    A.push(a);
    A.push(b);
    A.push(c);
    A.stampa();
    
    
    A.memorizzasufile("a.txt");
    
    try{
    A.pop(a);
    }
    catch(string){
    cout<<"\n Errore! stai tentato di estrarre una pila vuota"<<endl;
    }
    
    
    	
    }
     

    Grazie....
  • Re: [c++]memorizza su file

    Il metodo memorizzasufile non accetta alcun argomento ma tu ne passi uno in

    A.memorizzasufile("a.txt");

    Non puoi compilare con questo errore ...

    Comunque il problema è nel metodo

    clear

    in cui utilizzi temp senza inizializzarlo.
  • Re: [c++]memorizza su file

    Grandeeee !!!!!!!!!!! funzionaaaaa..... grazie 10000000000......gentilissimo...
    Ultima cosa mi sapresti dire in che altro modo testare questo esercizio?
    cioè ad esempio se voglio testare la pila template di testo va bene se faccio così?
      Pila <Testo * >* T =new Pila <Testo*>;
    	Testo TT("Ingegneria", "Programmazione");
    	Testo * aptr = & TT;
    	
    	T->push(aptr); //funziona
    	
         T->memorizzasufile() ;
    try{
    T->pop(aptr);
    }
    catch(string){
    cout<<"\n Errore! stai tentato di estrarre una pila vuota"<<endl;
    }
        
        system("PAUSE");
        return EXIT_SUCCESS;
    
    	
    } 
  • Re: [c++]memorizza su file

    Chi mi aiuta? please!
Devi accedere o registrarti per scrivere nel forum
10 risposte