QString.remove(), a usuwanie lini z plik.



  • Hej, chciałem napisać program "oczyszczający" plik z niechcianych znaków i udało mi się to za pomocą QString.remove

    
       QTextStream in(&plik);
       QString text = in.readAll(); //text = zawartość pliku
    
       ui->orginal->setPlainText(text);
    
      text.remove("()");
      ui->textBrowser_2->setPlainText(text);
     plik.close();
    

    Jednak okazało się że muszę usunąć całą linijkę w której znajduje się niechciany znak i tu pojawia się problem.

    Jest możliwość sprawdzenia czy w danej linijce pliku występuje określony znak i jeśli występuje to usunąć linię , a jeśli nie przejść do kolejnej linii ?


  • Moderators

    Tak. Szukaj znaku przy pomocy indexOf(), następnie poprzedniego znaku nowej linii i następnego (tą samą metodą). Mając dwa indeksy nowych linii, możesz użyć remove(int, int) by usunąć daną linię.


  • Moderators

    Ah, bo zapomniałem. Kolejne wywołania indexOf() mozesz zacząć od pierwszego indeksu nowej linii - w ten sposób nie będziesz przeszukiwać całego pliku od nowa za każdym razem.



  • Dzięki za podpowiedź, mam problem ze znalezieniem znaku nowej lini "/n", próbuję przeszukać plik tylko raz, później pomyślę nad pętlą.

    QString text = in.readAll(); //text = zawartość pliku
    ui->orginal->setPlainText(text);
    
    index1 =text.indexOf("(");
    index2 =text.indexOf("/n");
    text.remove(index1,index2);
    
    ui->textBrowser_2->setPlainText(text);
    ui->lcdNumber->display(index1);
    ui->lcdNumber_2->display(index2);
    //text.remove("()");
    
    plik.close();
    
    }
    

    IndexOf zwraca mi wartość -1 tak jakby w całym pliku nie było znaku nowej linii.
    Możesz podpowiedzieć jak wskazać na znak nowej linii ?


  • Moderators

    @Etro said in QString.remove(), a usuwanie lini z plik.:

    Możesz podpowiedzieć jak wskazać na znak nowej linii ?

    Znak nowej linii to \n a nie /n.



  • Głupi błąd ;)

       index1 =text.indexOf("(");
       index2 =text.indexOf("\n",index1);
       l=index2-index1+5;
       text.remove(index1,l);
       ui->textBrowser_2->setPlainText(text);
    

    Nie mogłem wymyślić sposobu aby znaleźć znak końca linii przed szukanym znakiem więc poradziłem sobie odejmując odpowiednią ilość znaków występujących przed szukanym znakiem. W moim przypadku ta liczba się nie zmieni, ale jak by ktoś znalazł sposób to było by fajnie.


  • Moderators

    lastIndexOf() powinno pomóc.

    Przy czym gdzy już będziesz szukał w pętli to index ostatniego znaku nowej linii to będzie po prostu miejsce w którym ostatnie przejście pętli zakończyło się.



  • Dzięki działa super. Wklejam kod może komuś się przyda.

    void MainWindow::on_pushButton_clicked()
    {
        filename=QFileDialog::getOpenFileName(
                    this,"Otwórz Program","C://","Programy (*.SS)"
                    );
        QMessageBox::information(this,tr("Nazwa pliku"),filename);
        
        QFile plik(filename);
        if(!plik.open(QFile::ReadOnly | QFile::Text))
        {
            QMessageBox::warning(this,"Plik nie został otwarty","Plik nie został otwarty");
        }
        
        QTextStream in(&plik);
        
        text = in.readAll(); //text = zawartość pliku
        plik.close();
        ui->orginal->setPlainText(text);
        a=0;
        
        //ile razy występuje znak:  (
        for (int i = 0; i < text.size(); ++i)
        {
            if (text.at(i) == QChar('('))
                a++;
        }
        
        for(i=0;i<a;i++)
        {
            index1 =text.indexOf("(");
            index3 = text.lastIndexOf("\n",index1);
            index2 =text.indexOf("\n",index1);
            l=index2-index3;
            text.remove(index3,l);
        }
        
        ui->textBrowser_2->setPlainText(text);
        
       
        plik.close();
    }
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.