Eliminare commenti da file

di il
8 risposte

Eliminare commenti da file

Salve, la traccia di un esercizio mi chiede di eliminare dal un file.txt tutto ciò che è comrpreso tra i caratteri di commento --->c'era una volta /* blabla bla */ e vissero felici e contenti
generando un altro file contenente la frase senza commenti ----> c'era una volta e vissero felici e contenti
volevo passare solmante attraverso i due file, senza caricare nulla in memoria, ma non ci sono riuscito,

dunque ho caricato la fase in un array

void eliminaCommenti(vettore & v, int &r){
    fstream out;
     out.open("nuovotesto.txt",ios::out);
     char commento='/';
  
   for (int i=0;i<r;i++)
     while (v[i]!=commento)<--------------------------------------------------------------------------
     out<<v[i];
     out.close();
     }
ma, doeve indicato con la freccia mi riporta un errore: ISO C++ forbids comparison between pointer and integer

e allora come devo fare?

8 Risposte

  • Re: Eliminare commenti da file

    Semplice: non fare la comparazione tra puntatori e char. Sono due cose distinte. v presumo sia una stringa quindi non puoi confrontarlo con il carattere '/'. Poi di questo si è già discusso ma non so se vuoi imparare oppure scrivere righe di codice che portano a nulla. Prima di scrivere codice pensa all'algoritmo da implementare.
  • Re: Eliminare commenti da file

    Perchè metti il char? ma credo che il while non terminerà mai come hai fatto tu xD e poi metti le parentesi graffe per favore non ci capisco mai niente senza xD

    void eliminaCommenti(vettore & v, int &r){
        fstream out;
         out.open("nuovotesto.txt",ios::out);
      
       for (int i=0;i<r;i++)
         while (v[i]!='/')<--------------------------------------------------------------------------
         out<<v[i];
         out.close();
         }
  • Re: Eliminare commenti da file

    Ho pensato a qualcosa del genere:
    
        void inserisci(){
         bool scrivi=true;
         char lettera,lettera2;
         fstream in,out;
         in.open("f1.txt",ios::in);
         out.open("f2.txt",ios::out);
         
         if(!in)
           cout<<"Il file f1 non e' presente";
         else
         
             while(!in.eof()){
               while (scrivi){
                  in>>lettera;
                  if(lettera!='/')
                   out<<lettera;  
                  if (lettera == '/')
                  scrivi=false;        
                              }
        
           
         in.close();
         out.close();
         }
    
    così mi prende tutte le lettere fino allo /, ora sto pensando come continuare
  • Re: Eliminare commenti da file

        void inserisci(){
         bool scrivi=true;
         string lettera,lettera2;      //cerca di usare le stringhe sono utilissime
         fstream in,out;
         in.open("f1.txt",ios::in);
         out.open("f2.txt",ios::out);
         
         if(!in)
           cout<<"Il file f1 non e' presente";
         else
         
             while(!in.eof()){
                       scrivi=true;
               while (scrivi){
                  in>>lettera;
                  if(lettera!='/')
                   out<<lettera;  
                  else{
                  scrivi=false;
                 getline(in,lettera); //in questo modo prende tutto quello che c'è su quella riga (da quello che ho capito a te serve così)       
                             }
                         }
        
           
         in.close();
         out.close();
         }

    spero si capisca se vuoi chiarimenti su quello che ho fatto chiedi pure. Per altre soluzioni aspetta gli esperti.
  • Re: Eliminare commenti da file

    In realtà quello che da il tuo programma lo fa anche il mio, il problema nasce dopo, ossia quando deve smettere di inviare al flusso di uscita, iniziare a contare le lettere del commento e poi ritornare allo stato iniziale per cercare eventuali altri commenti
  • Re: Eliminare commenti da file

    Mhh sicuro? quello che ho scritto io dovrebbe leggere ogni parola fino a / poi appena arriva il commento lo mette nella variabile lettera ma non lo fa andare nel file in uscita praticamente salta tutta la riga e torna al primo while controlla che il file non sia finito e ricomincia il ciclo per la ricerca dei commenti.

    anzi se fai così è meglio xD
    while(!in.eof()){
                 
                  in>>lettera; //lettera prende la parola dal file
    
                  if(lettera!='/')   //se la parola è diversa da /
                       {
                          out<<lettera;    //la parola viene scritta nel file
                       }
      
                  else              //altrimenti (se lettera è uguale a /)
                    {
                        getline(in,lettera);  //viene presa tutta la riga del commento ma non viene fatta scrivere sul file 
                    }
    
                }   
           
         in.close();
         out.close();
    
  • Re: Eliminare commenti da file

    Si, ma così facendo se dopo incontro altri commenti (come nel mio caso) non se ne accorge

    esempio

    quest'anno i ragazzi avranno l'esame/*di analisi 1*/ il giorno 13 settembre/*se non piove*/
  • Re: Eliminare commenti da file

    Così facendo analizziamo lettera per lettera e non parola per parola
    while(!in.eof())
    {
      string temp;
      getline(in,temp);
      lettera=lettera+temp;
    }
              
                 int i=0;
    
                 while(i<lettera.size())
                       {
                         
                    if(lettera[i]!='/')   //se la parola è diversa da /
                       {
                          out<<lettera[i];    //la parola viene scritta nel file
                       }
      
                  else            
                      {
                             while(lettera[i]!='/'&&i<lettera.size())
                                {
                                   i++;
                                }
                              i--;
                      }
                   i++;            
                }   
           
         in.close();
         out.close();
Devi accedere o registrarti per scrivere nel forum
8 risposte