Lista concatenata e File [C++]

di il
23 risposte

Lista concatenata e File [C++]

Ciao ragazzi, sono bloccato nella scrittura di un software, e penso siate gli unici in grado di aiutarmI!
Sto scrivendo un programma in C++ nelle cui specifiche è richiesto l'uso di una lista concatenata(che devo implementare come una classe) che deve contenere membri di una classe x(cosa mi consigliate, di far diventare la classe x derivata di quella Lista?O implementare la x all'interno di Lista?) e che deve essere salvata su file.
Per questa lista inoltre devo implementare le funzioni di inserimento, modifica, ordinamento e visualizzazione (le solite cose, insomma, anche se non so ancora se implementarle per la lista o semplicemente per la classe x). Il mio problema è che non riesco ad effettuare la scrittura su file/lettura da file di una lista fatta in questo modo!!
Potete fornirmi esempi di codice a riguardo o spiegarmi come fare??
Vi ringrazio!

23 Risposte

  • Re: Lista concatenata e File [C++]

    Per una lista concatenata puoi offrire l' amicizia del nodo alla classe della lista così che puoi accedere ai membri privati della classe Nodo. Crei la Classe Nodo ( penso sia la tua classe x ) con tutti i suoi membri più un puntatore a se stesso e offri l' amicizia alla classe lista
    
    class Nodo {
        friend class lista;
       public:
            Nodo ( .... ) ;
             .......... //  funzioni membro ;
      private :
          .... dati
          Nodo* p ;
    };
    
    class lista {
     public:
          lista () : FirstPtr (0) , LastPtr (0) {};
          .........
    private:
         Nodo* FirstPtr, *LastPtr;
    };
    
    Ovviamente inserimento , modifica , ordinamento , ec.. sono tutte funzioni memmrbo della classe lista. Scusami per la scrittura di un file è come se stessi facendo la stampa a video della lista solo che la devi fare su un ofstream ( file ) al posto di un ostream ( cout ).

    Per qualsiasi dubbio , incolla il codice che hai fatto fino ad ora e chiedi pure
  • Re: Lista concatenata e File [C++]

    Grazie mille Alessandro, entro lunedì pomeriggio pubblicherò la prima bozza del programma così mi dici che ne pensi. Mi sei stato veramente d'aiuto, mi ero incasinato un po' con gli stream!
  • Re: Lista concatenata e File [C++]

    Certo ^_-
  • Re: Lista concatenata e File [C++]

    Ciao Alessandro, scusa il ritardo ma ho avuto un po' di problemi. Per ora ho sviluppato solo la funzione di visualizzazione della lista, e già così mi segnala:
    errore nel typedef di posizione;
    errore nelle funzioni friend;
    e altri warning che non riesco a capire in fase di compilazione!
    il problema è che non riesco a risolverli, qualunque cosa faccia.

    Ti riporto il codice scritto finora:
    /*Programma per la gestione di un rivenditore di automobili*/
    
    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    //DATI GLOBALI
    
    const int num=50;
    
    
    //CLASSI
    
    typedef Mezzo *posizione;
    class Lista;
     
    class Mezzo{
          Mezzo *next;
          char nomeprodotto[num];
          char targa[num];
          char casaproduttrice[num];
          int ruote;
          int anno;
          public:
                 friend void Cancella(posizione p);
                 friend posizione Precedente(posizione p);
                 friend posizione Successivo(posizione p);
                 friend posizione Ricerca(posizione p, char *s)
                 }
    
    
    
    class Lista{
          posizione primo, ultimo;
          public:
                 Lista();
                 ~Lista();
                 void Cancella(posizione p);
                 posizione Precedente(posizione p);
                 posizione Successivo(posizione p);
                 posizione Ricerca(posizione p, char *s)
                 }
                 
    int main()
    {   
        register int i;
        do{
                 
              cout<< "\n                        PROGRAMMA GESTIONE AUTOSALONE\n\n";
    		  cout<< "                     ______________Menu______________\n\n";
    		  cout<< "                         (I)nserimento prodotto\n";
    		  cout<< "                         (O)rdinamento magazzino\n";
    		  cout<< "                         (V)isualizzazione magazzino\n";
    		  cout<< "                         (M)odifica singolo prodotto\n";
    		  cout<< "                         (R)icerca singolo prodotto\n";
    		  cout<< "                         (E)liminazione prodotto\n";
    		  cout<< "                         (U)scita programma\n\n";
    		
    		  cout<< "Nota: Indicare la scelta con la lettera tra parentesi\n";
    		  cin>> scelta;
    
    		  switch(tolower(scelta)) {
                                      
                                      case 'i':
                                           break;
                                                    
                                               
                                      case 'o':
                                           break;
                                                   
                                      case 'v':
                                           Mezzo a[num];
                                           posizione q;
                                           ifstream in("autosalone");
                                           if(!in){
                                                    cout<< "Impossibile aprire il file!\n";
                                                    return 1;
                                                    }
                                           for(i=0; i<num; i++){
                                                     in >> a[i];
                                                     cout << a;
                                                     }
                                           in.close();
                                           break;
                                                        
                                      case 'm':
                                           break;
                                                   
                                      case 'r':
                                           break;            
                                                        
                                                                                      }
           	                          
             }while(tolower(scelta)!='u');
        system("pause");
        return 0;
    
    //FUNZIONI
    
    //funzioni membro lista
    Lista::Lista()
    {
                  primo=new Mezzo;
                  primo->next=NULL;
                  ultimo=primo;
    }
    Lista::~Lista()
    {
                   posizione pnext, q;
                   for(q=primo; q!=NULL;)
                   {
                                 pnext=q->next;
                                 delete q;
                                 q=pnext;
                   }
    }
    posizione Lista::Precedente(posizione p)
    {         
              posizione pos;
              if(p!=primo)
              {
                          for(pos=primo; pos->next!=p; pos=pos->next);
                          return pos;
              }
              else {
                   cout<< "La posizione è inesistente\n";
                   exit(1);
                   }
    }
    posizione Lista::Successivo(posizione p)
    {
              return p->next;
    }
    void Lista::Cancella(posizione p)
    {
         posizione q;
         while(q->next!=p){
                           q=q->next;
                           }
         q->next=p->next;
         delete p;
    }
    posizione Lista::Ricerca(posizione p, char *s)
    {
              p=primo;
              while(p!=NULL && !strcpy(s, p->nomeprodotto))
              {
                            p=p->next;
              }
              return p;
    }
                           
    
    
    //OPERATORI
    
    ostream &operator<<(ostream &stream, Mezzo obj)
    {       
            cout << "Nome prodotto\n";
            stream << obj.nomeprodotto << "/n";
            cout << "Targa\n";
            stream << obj.targa << "/n";
            cout << "Casa produttrice\n";
            stream << obj.casaproduttrice << "/n";
            cout << "Numero ruote\n";
            stream << obj.ruote << "/n";
            cout << "Anno di produzione\n";
            stream << obj.anno << "/n";
            return stream;
    }
    
    istream &operator>>(istream &stream, Mezzo obj)
    {       
            char str[num];
            cout<< "Inserire nome prodotto\n";
            stream >> obj.nomeprodotto << "/n";
            cout<< "Inserire la targa\n";
            stream >> obj.targa << "/n";
            cout<< "Inserire il nome della casa produttrice\n";
            stream >> obj.casaproduttrice << "/n";
            cout<< "Inserire il numero delle ruote\n";
            stream >> obj.ruote << "/n";
            cout<< "Inserire l'anno di produzione\n";
            stream >> obj.anno << "/n";
            return stream;
    }
    
    Che dici?
  • Re: Lista concatenata e File [C++]

    Allora ti definisco io la classe , le friend di norma si mettono prima del public , cmq doveva essere così:
    
    class Mezzo {
        friend class lista;
        public:
              Mezzo( char s[] , char t[] , char c[], int r , int a ); // inizializzi rispettto i dati e il next = 0 
        private:
             Mezzo *next;
             char nomeprodotto[num];
             char targa[num];
             char casaproduttrice[num];
             int ruote;
             int anno;
    };
    
    
    class lista {
       public :
            lista() : primo(0) , ultimo ( 0 ) {};
            ~Lista();
            void Cancella(posizione p);
            Mezzo* Precedente(posizione p);
            Mezzo* Successivo(posizione p);
            Mezzo* Ricerca(posizione p, char *s)
       private:
           Mezzo *primo,*ultimo;
    };
    
  • Re: Lista concatenata e File [C++]

    Ciao alessandro, ho risolto il problema (ho fatto a modo mio con le classi, ma i tuoi consigli sono stati veramente illuminanti! ora però ho un altro tipo di problema! Quando compila il codice mi segnala un unico problema ma ripetuto in più punti: mi segnala mancanz edi punti e virgola lì dove non ce ne sarebbe bisogno! Puoi provare a compilarlo tu e mi dici che te ne pare? Inoltre qualsiasi altro consiglio (non solo di funzionamento ma anche "estetico", è ben accetto! )
    Grazie mille!
    /*Programma per la gestione di un rivenditore di automobili*/
    
    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<cstdio>
    #include<cctype>
    using namespace std;
    
    //DATI GLOBALI
    
    const int num=50;
    
    
    //CLASSI
    
    class Mezzo{
          private:
                  char nomeprodotto[num];
                  char casaproduttrice[num];
                  int prezzo;
                  int anno;
          public: void set_mezzo();
                  void get_mezzo();
          };
    
    struct Nodo{
           Mezzo x;
           Nodo *next;
           };
           
    class Lista{
          private:
                  Nodo *primo, *ultimo;
                  int num_mezzi;
          public:
                 Lista();
                 ~Lista();
                 void Caricamento_da_File();
                 void Inserimento_in_Lista();
                 void Cancella_Mezzo(Nodo* knot);
                 Nodo* Ricerca_Mezzo();
                 void Modifica_Mezzo(Nodo *knot);
                 void Ordinamento_Catalogo();
                 Nodo *returnprimo(){return primo;};
                 void Salvataggio_su_File();
          };
          
    
    int main()
    {
        Lista list;   
        char scelta;
        list.Caricamento_da_File();
        
        char ch;
        
              cout<< "\n                        PROGRAMMA GESTIONE AUTOSALONE\n\n";
    		  cout<< "                     ______________Menu______________\n\n";
    		  cout<< "                         (I)nserimento veicolo\n";
    		  cout<< "                         (O)rdinamento catalogo\n";
    		  cout<< "                         (V)isualizzazione catalogo\n";
    		  cout<< "                         (M)odifica singolo veicolo\n";
    		  cout<< "                         (R)icerca singolo veicolo\n";
    		  cout<< "                         (E)liminazione veicolo\n";
    		  cout<< "                         (U)scita programma\n\n";
    		
    		  cout<< "Nota: Indicare la scelta con la lettera tra parentesi\n";
    		  cin>> ch;
        
           
    
        
        scelta=tolower(ch);
        switch(scelta){
                       case 'i':
                                cout<<"\a\n\n\t\tINSERIMENTO NUOVO VEICOLO\n\n\t\t";
                                list.Inserimento_in_Lista();
                                break;
                       case 'o':
                                cout<<"\a\n\n\t\tORDINA CATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ordinare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     cout<< "\n\nOrdinamento in corso...";
                                     list.Ordinamento_Catalogo(); 
                                break;
                       case 'v':
                                Nodo *tempv;
                                cout<<"\a\n\n\t\tCATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da mostrare\n";
                                             system("pause");
                                }
                                else
                                {
                                    tempv = list.returnprimo();
                                    while ( tempv != 0 )
                                    {
                                      tempv->x.get_mezzo();
                                      cout << "\n";
                                      tempv = tempv->next;
                                    }
                                }
                                break;
                                                        
                       case 'm':
                                Nodo* tempm;
                                cout<<"\a\n\n\t\tMODIFICA VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da modificare\n";
                                             system("pause");
                                }
                                else list.Modifica_Mezzo(tempm); 
                                break;
                                                   
                       case 'r':
                                Nodo* tempr;
                                cout<<"\a\n\n\t\tRICERCA NUOVO VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ricercare\n";
                                             system("pause");
                                }
                                else tempr=list.Ricerca_Mezzo();
                                if (tempr==0)
                                {
                                            cout<<"\n\nVeicolo impossibile da trovare. Controllare che il nome\n";
                                            cout<<"sia stato inserito correttamente\n\n";
                                }
                                else 
                                {
                                     cout<<"Il veicolo trovato \x8a: \n";
                                     tempr->x.get_mezzo();
                                }
                                break;
                       case 'e':
                                Nodo* tempe;
                                cout<<"\a\n\n\t\tELIMINAZIONE VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da cancellare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     tempe=list.Ricerca_Mezzo();
                                     cout<<"Eliminazione del veicolo in corso....\n\n ";
                                     list.Cancella_Mezzo(tempe);
                                break;
                       case 'u':
                                cout<< "\nBuona Giornata";
                                return 0;
                                break;
                      }
                }
        list.Salvataggio_su_File();        
                      
        system("pause");
        return 0;
    }
    
    //FUNZIONI
    
        
    //funzioni membro Lista
    Lista::Lista()
    {
            primo=0;
            ultimo=0;
            num_mezzi=0;
    }
    //FUNZIONI
    //CARICAMENTO DA FILE
    void Lista::Caricamento_Da_File()
    {
        Mezzo a;
        Nodo* knot;
        ifstream in("Catalogo.pdf");
        if(!in)
            {
                cout<<"\nCatalogo vuoto\n";
                system("pause");
            }
    
        do
            { 
                in>>a.nomeprodotto;
                in>>a.casaproduttrice;
                in>>a.prezzo;
                in>>a.anno;
                num_mezzi++;
                knot=new nodo;
                knot->x=a;
                knot->next=primo;
                primo=knot;
            }
            while(!in.eof());
            }
        cout<< "\n\n\a File caricato con successo!\n\n";
    }
    //INSERIMENTO MEZZO
    void Lista::Inserimento_in_Lista()
    {
        Nodo* knot;
        int register i;
        int k=0;
        cout<< "\n\nIndicare il numero di mezzi da inserire nel Catalogo\n\n";
        cin>> k;
        for(i=0; i<=k; i++)    
        {
            knot=new Nodo;
            knot->x.set_mezzo();
            
            knot->next=primo;
            primo=knot;
        }
        num_mezzi=num_mezzi+k;
    }
    //SCRITTURA DATI MEZZO
    void Mezzo::set_mezzo()
    {   
        char str1[num];
        char str2[num];
        cout<<"\n\n Inserisci il nome:  ";
        gets(str1);
        strcpy(nomeprodotto, str1);
        cout<<"\n\n Inserisci la casa produttrice:  ";
        gets(str2);
        strcpy(casaproduttrice, str2);
        cout<<"\n\n Inserisci il prezzo:  ";
        cin>>prezzo;
        cout<< "\n\nInserisci l'anno di produzione:  ";
        cin>>anno;
        cout<<"\n";
    }
    //LETTURA DATI MEZZO
    void Mezzo::get_mezzo()
    {   
        cout<<"\n\n Nome prodotto:  ";
        cout<< nomeprodotto;
        cout<<"\n\n Casa Produttrice:  ";
        cout<< casaproduttrice;
        cout<<"\n\n Prezzo:  ";
        cout<< prezzo;
        cout<< "\n\nAnno di Produzione:  ";
        cout<< anno;
        cout<<"\n";
    }
    //ELIMINAZIONE DALLA LISTA
    void Lista::Cancella_Mezzo(Nodo *knot)
    {
         Nodo* t;
         if(knot==primo)
         {
                  t=knot->next;
                  primo=t;
         }
         else if(knot==ultimo)
         {
              t=primo;
              while(t->next != knot)
              {
                           t=t->next;
              }
              t->next=0;
              ultimo=t;
         }
         else
         {
             t=primo;
             while(t->next != knot)
             {
                           t=t->next;
             }
             t->next=knot->next;
         }
         delete knot;
         num_mezzi--;
         cout<<"Veicolo eliminato\n\n";
         system("pause");
    }
    
    //RICERCARE MEZZO
    Nodo* Lista::Ricerca_Mezzo()
    {    
         Nodo* knot1, knot2=0;
         str[num];
         cout<<"\nIndicare il nome del veicolo:\n";
         gets(str);
         while(str=="/0")
         {
                cout<<"\nNome non valido. Reinserire il nome del veicolo\n";
         }
         do
         {
                
              knot1=primo;
              if(!strcmp(knot1->x.nomeprodotto, str))
              { 
                return knot1;
              }
         
         knot1=knot1->next;
         }while(knot1!=0);
         return knot2;
    }
    
    //MODIFICARE ELEMENTO LISTA
    void Lista::Modifica_Mezzo(Nodo *knot)
    {
         Nodo* t;
         cout<< "\nInserire dati per il nuovo veicolo\n\n";
         t->x.set_mezzo();
         knot->x=t->x;
         cout<< "\n Visualizzazione del veicolo modificato\n";
    }
    
    //ORDINARE LISTA
    void Lista::Ordinamento_Catalogo()
    {    
         Nodo *knot, t;
         Nodo *Array[num_mezzi];
         register int i=0, j;
         int flag=0;
         knot=primo;
         for(i<0; i< num_mezzi; i++)
         {
                  Array[i]=knot;
                  knot=knot->next;
         }
         do
         {
                  for(j=n_mezzi-1; j>i; j-)
                  {
                        if(Array[j]->x.nomeprodotto < Array[j-1]->x.nomeprodotto)
                        {
                                t=Array[j];
                                Array[j]=Array[j-1];
                                Array[j-1]=t;
                                flag=1;
                        }
                  }
                  i++;
         }while(flag&&i<num_mezzi);
         cout << "\a\n\nOrdinamento completato!\n\n";
    }
    
    //SALVATAGGIO SU FILE
    void Lista::Salvataggio_su_File()
    {
         Nodo* knot=primo;
         ofstream out("Catalogo.pdf",ios::out);
         while(knot!=0)
            {
                out<<knot->x.nomeprodotto;
                out<<knot->x.casaproduttrice;
                out<<knot->x.prezzo;
                out<<knot->x.anno;
                knot=knot->next;//continua il ciclo
            }
    
        out.close();
    }
    
    //DISTRUTTORE LISTA
    
    Lista::~Lista()
    {
         Nodo* knot=primo;
         do
         {
            if(knot==ultimo)
            {
                delete knot;
                knot=0;
            }
            else
            {
            knot=knot->next;
            delete knot->next;
            }
        }
        while(knot!=0);
    }
  • Re: Lista concatenata e File [C++]

    else
     {
       cout<< "\n\nOrdinamento in corso...";
       list.Ordinamento_Catalogo();
    break;
    Non manca qualcosa?
    Idem quà:
    else
    {
       tempe=list.Ricerca_Mezzo();
       cout<<"Eliminazione del veicolo in corso....\n\n ";
       list.Cancella_Mezzo(tempe);
    break;
  • Re: Lista concatenata e File [C++]

    
    cout<<"\n\n Inserisci il nome:  ";
    gets(str1);
    
    C++ mixato a C, proibito. Cosa c'è di male nell'usare cin oppure std::getline?
  • Re: Lista concatenata e File [C++]

    Stupide parentesi! Comunque sul mio manuale di Informatica non si parla di getline, ma solo di gets! Come funziona? Ci sono altre istruzioni che non vedi nel programma che potresti suggerirmi?
  • Re: Lista concatenata e File [C++]

    Tra l'altro avevo fatto più di un errore, tra parentesi e asterischi! Ora però lo compila... ma non me lo esegue correttamente! Vi ripropongo il codice corretto, col debug non ci sto capendo molto...
    /*Programma per la gestione di un rivenditore di automobili*/
    
    #include<iostream>
    #include<fstream>
    #include<cstring>
    #include<cstdio>
    #include<cctype>
    using namespace std;
    
    //DATI GLOBALI
    
    const int num=50;
    
    
    //CLASSI
    
    class Mezzo{
          public:
                  char nomeprodotto[num];
                  char casaproduttrice[num];
                  int prezzo;
                  int anno;
                  void set_mezzo();
                  void get_mezzo();
          };
    
    struct Nodo{
           Mezzo x;
           Nodo *next;
           };
           
    class Lista{
          private:
                  Nodo *primo, *ultimo;
                  int num_mezzi;
          public:
                 Lista();
                 ~Lista();
                 void Caricamento_da_File();
                 void Inserimento_in_Lista();
                 void Cancella_Mezzo(Nodo* knot);
                 Nodo* Ricerca_Mezzo();
                 void Modifica_Mezzo(Nodo *knot);
                 void Ordinamento_Catalogo();
                 Nodo *returnprimo(){return primo;};
                 void Salvataggio_su_File();
          };
          
    
    int main()
    {
        Lista list;   
        char scelta;
        list.Caricamento_da_File();
        
        char ch;
        
              cout<< "\n                        PROGRAMMA GESTIONE AUTOSALONE\n\n";
    		  cout<< "                     ______________Menu______________\n\n";
    		  cout<< "                         (I)nserimento veicolo\n";
    		  cout<< "                         (O)rdinamento catalogo\n";
    		  cout<< "                         (V)isualizzazione catalogo\n";
    		  cout<< "                         (M)odifica singolo veicolo\n";
    		  cout<< "                         (R)icerca singolo veicolo\n";
    		  cout<< "                         (E)liminazione veicolo\n";
    		  cout<< "                         (U)scita programma\n\n";
    		
    		  cout<< "Nota: Indicare la scelta con la lettera tra parentesi\n";
    		  cin>> ch;
        
           
    
        
        scelta=tolower(ch);
        switch(scelta){
                       case 'i':
                                cout<<"\a\n\n\t\tINSERIMENTO NUOVO VEICOLO\n\n\t\t";
                                list.Inserimento_in_Lista();
                                break;
                       case 'o':
                                cout<<"\a\n\n\t\tORDINA CATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ordinare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     cout<< "\n\nOrdinamento in corso...";
                                     list.Ordinamento_Catalogo(); 
                                }
                                break;
                       case 'v':
                                Nodo *tempv;
                                cout<<"\a\n\n\t\tCATALOGO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da mostrare\n";
                                             system("pause");
                                }
                                else
                                {
                                    tempv = list.returnprimo();
                                    while ( tempv != 0 )
                                    {
                                      tempv->x.get_mezzo();
                                      cout << "\n";
                                      tempv = tempv->next;
                                    }
                                }
                                break;
                                                        
                       case 'm':
                                Nodo* tempm;
                                cout<<"\a\n\n\t\tMODIFICA VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da modificare\n";
                                             system("pause");
                                }
                                else list.Modifica_Mezzo(tempm); 
                                break;
                                                   
                       case 'r':
                                Nodo* tempr;
                                cout<<"\a\n\n\t\tRICERCA NUOVO VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da ricercare\n";
                                             system("pause");
                                }
                                else tempr=list.Ricerca_Mezzo();
                                if (tempr==0)
                                {
                                            cout<<"\n\nVeicolo impossibile da trovare. Controllare che il nome\n";
                                            cout<<"sia stato inserito correttamente\n\n";
                                }
                                else 
                                {
                                     cout<<"Il veicolo trovato \x8a: \n";
                                     tempr->x.get_mezzo();
                                }
                                break;
                       case 'e':
                                Nodo* tempe;
                                cout<<"\a\n\n\t\tELIMINAZIONE VEICOLO\n\n\t\t";
                                if (list.returnprimo()==0)
                                {            
                                             cout<< "Lista vuota. Non c'\x8a nulla da cancellare\n";
                                             system("pause");
                                }
                                else 
                                {
                                     tempe=list.Ricerca_Mezzo();
                                     cout<<"Eliminazione del veicolo in corso....\n\n ";
                                     list.Cancella_Mezzo(tempe);
                                }
                                break;
                       case 'u':
                                cout<< "\nBuona Giornata";
                                return 0;
                                break;
                      
                
        list.Salvataggio_su_File();        
        }              
        system("pause");
        return 0;
    }
    
    //FUNZIONI
    
        
    //funzioni membro Lista
    Lista::Lista()
    {
            primo=0;
            ultimo=0;
            num_mezzi=0;
    }
    //FUNZIONI
    //CARICAMENTO DA FILE
    void Lista::Caricamento_da_File()
    {
        Mezzo a;
        Nodo* knot;
        ifstream in("Catalogo.pdf");
        if(!in)
            {
                cout<<"\nCatalogo vuoto\n";
                system("pause");
            }
    
        do
            { 
                in>>a.nomeprodotto;
                in>>a.casaproduttrice;
                in>>a.prezzo;
                in>>a.anno;
                num_mezzi++;
                knot=new Nodo;
                knot->x=a;
                knot->next=primo;
                primo=knot;
            }
            while(!in.eof());
            
        cout<< "\n\n\a File caricato con successo!\n\n";
    }
    //INSERIMENTO MEZZO
    void Lista::Inserimento_in_Lista()
    {
        Nodo* knot;
        int register i;
        int k=0;
        cout<< "\n\nIndicare il numero di mezzi da inserire nel Catalogo\n\n";
        cin>> k;
        for(i=0; i<=k; i++)    
        {
            knot=new Nodo;
            knot->x.set_mezzo();
            
            knot->next=primo;
            primo=knot;
        }
        num_mezzi=num_mezzi+k;
    }
    //SCRITTURA DATI MEZZO
    void Mezzo::set_mezzo()
    {   
        char str1[num];
        char str2[num];
        cout<<"\n\n Inserisci il nome:  ";
        gets(str1);
        strcpy(nomeprodotto, str1);
        cout<<"\n\n Inserisci la casa produttrice:  ";
        gets(str2);
        strcpy(casaproduttrice, str2);
        cout<<"\n\n Inserisci il prezzo:  ";
        cin>>prezzo;
        cout<< "\n\nInserisci l'anno di produzione:  ";
        cin>>anno;
        cout<<"\n";
    }
    //LETTURA DATI MEZZO
    void Mezzo::get_mezzo()
    {   
        cout<<"\n\n Nome prodotto:  ";
        cout<< nomeprodotto;
        cout<<"\n\n Casa Produttrice:  ";
        cout<< casaproduttrice;
        cout<<"\n\n Prezzo:  ";
        cout<< prezzo;
        cout<< "\n\nAnno di Produzione:  ";
        cout<< anno;
        cout<<"\n";
    }
    //ELIMINAZIONE DALLA LISTA
    void Lista::Cancella_Mezzo(Nodo *knot)
    {
         Nodo* t;
         if(knot==primo)
         {
                  t=knot->next;
                  primo=t;
         }
         else if(knot==ultimo)
         {
              t=primo;
              while(t->next != knot)
              {
                           t=t->next;
              }
              t->next=0;
              ultimo=t;
         }
         else
         {
             t=primo;
             while(t->next != knot)
             {
                           t=t->next;
             }
             t->next=knot->next;
         }
         delete knot;
         num_mezzi--;
         cout<<"Veicolo eliminato\n\n";
         system("pause");
    }
    
    //RICERCARE MEZZO
    Nodo* Lista::Ricerca_Mezzo()
    {    
         Nodo* knot1;
         Nodo* knot2=0;
         char str[num];
         cout<<"\nIndicare il nome del veicolo:\n";
         gets(str);
         while(str=="/0")
         {
                cout<<"\nNome non valido. Reinserire il nome del veicolo\n";
         }
         do
         {
                
              knot1=primo;
              if(!strcmp(knot1->x.nomeprodotto, str))
              { 
                return knot1;
              }
         
         knot1=knot1->next;
         }while(knot1!=0);
         return knot2;
    }
    
    //MODIFICARE ELEMENTO LISTA
    void Lista::Modifica_Mezzo(Nodo *knot)
    {
         Nodo* t;
         cout<< "\nInserire dati per il nuovo veicolo\n\n";
         t->x.set_mezzo();
         knot->x=t->x;
         cout<< "\n Visualizzazione del veicolo modificato\n";
    }
    
    //ORDINARE LISTA
    void Lista::Ordinamento_Catalogo()
    {    
         Nodo *knot, *t;
         Nodo *Array[num_mezzi];
         register int i=0, j;
         int flag=0;
         knot=primo;
         for(i<0; i< num_mezzi; i++)
         {
                  Array[i]=knot;
                  knot=knot->next;
         }
         do
         {
                  for(j=num_mezzi-1; j>i; j--)
                  {
                        if(Array[j]->x.nomeprodotto < Array[j-1]->x.nomeprodotto)
                        {
                                t=Array[j];
                                Array[j]=Array[j-1];
                                Array[j-1]=t;
                                flag=1;
                        }
                  }
                  i++;
         }while(flag&&i<num_mezzi);
         cout << "\a\n\nOrdinamento completato!\n\n";
    }
    
    //SALVATAGGIO SU FILE
    void Lista::Salvataggio_su_File()
    {
         Nodo* knot=primo;
         ofstream out("Catalogo.pdf",ios::out);
         while(knot!=0)
            {
                out<<knot->x.nomeprodotto;
                out<<knot->x.casaproduttrice;
                out<<knot->x.prezzo;
                out<<knot->x.anno;
                knot=knot->next;//continua il ciclo
            }
    
        out.close();
    }
    
    //DISTRUTTORE LISTA
    
    Lista::~Lista()
    {
         Nodo* knot=primo;
         do
         {
            if(knot==ultimo)
            {
                delete knot;
                knot=0;
            }
            else
            {
            knot=knot->next;
            delete knot->next;
            }
        }
        while(knot!=0);
    }
    
    
  • Re: Lista concatenata e File [C++]

    Cambia manuale di informatica. gets() è deprecata e non va utilizzata in C, figuriamoci in C++ dove esistono altre funzioni fatte semplicemente meglio.

    funzione getline

    Guarda l'esempio nella pagina.
  • Re: Lista concatenata e File [C++]

    Ciao a tutti, avevo un problema sempre di questo tipo, però in questo caso la lista tratta elementi che fanno parte di una gerarchia polimorfa, quindi tratta puntatori ad oggetti della classe base.
    Ecco la lettura e la scrittura che ho fatto:
    
    void lista::salva_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::out);
         if (!file) cout << "errore apertura";
         else
         {
             nodo* app=l;
             while (app)
             {
                   file << app->get_elem() << endl;
                   app=app->get_next();
             }
         }
         file.close();
    }
    
    void lista::apri_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::in);
         if (!file) cout << "errore nel file";
         else
         {
             tipo app;
             while (file >> app) push(app); QUI DA PROBLEMI!!!!!!!!!!
         }
         file.close();
    }
    
    Ricordo che il tipo di datp tipo è un typedef sul tipo trattato dalla lista, precisamente è un puntatore ad oggetto di classe base della mia gerarchia polimorfa.
    La scrittura su file la fa bene, l'unico problema sta nella funzione apri_file, più precisamente nel prendere i dati: l'operazione file >> app prende in effetti un puntatore salvato sul file e lo mette in app. Ma non funziona. Ho provato a fare un typecast del tipo file >> (char*)app e me lo dava buono quando compilo, però in esecuzione non funziona per niente.
    Avete idee in merito?
  • Re: Lista concatenata e File [C++]

    
      tipo app;
    
    potrei vedere che il typedef?
  • Re: Lista concatenata e File [C++]

    Si, allora, ci ho ragionato e ho capito degli sbagli grossolani, ma ancora non ho raggiunto il risultato:
    1- non ho messo una funzione membro all'interno delle mie classi che permettesse ad un oggetto di assere letto/scritto da file
    2-usare tipo app non ha senso...

    cmq l'esercizio che ho io ho questa gerarchia: articolo che può esssere o un dvd o un videogioco.
    Quindi: typedef articolo* tipo.
    Quando voglio fare la scrittura su file, devo prendere gli indirizzi salvati nella lista e scrivere su file gli oggetti puntati (non gli indirizzi).
    Quindi per la lettura devo leggere i dati e metterli in un nuovo oggetto salvato dinamicamente, il cui indirizzo è salvato nella lista.

    Se ci siete fin qui, io ho rifatto(stavolta bene) la scrittura su file:
    
    void lista::scrivi_su_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::out|ios::app);
         if (!file) cout << "errore apertura";
         else
         {
             nodo* app=l;
             while (app)
             {
                   app->get_elem()->scrivi(file);
                   file << endl;
                   app=app->get_next();
             }
         }
         file.close();
    }
    
    IL MIO PROBLEMA FONDAMENTALE NELLA LETTURA DA FILE E' IL SEGUENTE: QUANDO LEGGO UN FILE, DATO CHE APPARTIENE AD UNA GERARCHIA POLIMORFA, NON SO SE è UN ARTICOLO, UN VIDEOGIOCO, O UN DVD, QUINDI COME FACCIO A CAPIRE QUANDO FINISCE LA LETTURA? HO PENSATO SEMPLICEMENTE QUANDO TORNA A CAPO. MA IL PROBLEMA ANCORA PIù GRANDE E': COME FACCIO A COSTRUIRE ED ALLOCARE UN OGGETTO NON SAPENDO DI CHE TIPO E' IN PARTENZA? FORSE IL PROBLEMA SI RISOLVE CON I FILE BINARI? MA COMUNQUE NON SAPREI CHE TIPO DI COSTRUTTORE CHIAMARE!
    
    void lista::leggi_da_file(const char* percorso)
    {
         fstream file;
         file.open(percorso,ios::in);
         if (!file) cout << "errore nel file";
         else
         {
               [b]....?????????......
                 push( DI COSA?);[/b]
             }
         }
         file.close();
    }
    
Devi accedere o registrarti per scrivere nel forum
23 risposte