Eliminare commenti da file

di Anonimizzato9570 il
8 risposte
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

  • 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.
  • 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();
         }
  • 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
  •     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.
  • 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
  • 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();
    
  • 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*/
  • 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