Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Polish
  4. QString.remove(), a usuwanie lini z plik.
Forum Updated to NodeBB v4.3 + New Features

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

Scheduled Pinned Locked Moved Solved Polish
9 Posts 3 Posters 3.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    Etro
    wrote on last edited by
    #1

    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 ?

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #2

      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ę.

      (Z(:^

      1 Reply Last reply
      0
      • sierdzioS Offline
        sierdzioS Offline
        sierdzio
        Moderators
        wrote on last edited by
        #3

        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.

        (Z(:^

        1 Reply Last reply
        0
        • E Offline
          E Offline
          Etro
          wrote on last edited by
          #4

          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 ?

          sierdzioS 1 Reply Last reply
          0
          • E Etro

            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 ?

            sierdzioS Offline
            sierdzioS Offline
            sierdzio
            Moderators
            wrote on last edited by
            #5

            @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.

            (Z(:^

            1 Reply Last reply
            0
            • E Offline
              E Offline
              Etro
              wrote on last edited by
              #6

              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.

              1 Reply Last reply
              0
              • sierdzioS Offline
                sierdzioS Offline
                sierdzio
                Moderators
                wrote on last edited by
                #7

                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ę.

                (Z(:^

                1 Reply Last reply
                0
                • E Offline
                  E Offline
                  Etro
                  wrote on last edited by
                  #8

                  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();
                  }
                  
                  1 Reply Last reply
                  1
                  • P Offline
                    P Offline
                    pebal
                    wrote on last edited by
                    #9

                    Możesz użyć wyrażenia regularnego jako wzorca:

                    QString charsToRemove = "()";
                    QRegularExpression re("[^\\n]*["+charsToRemove+"][^\\n$]*[\n]?");
                    text.remove(re);
                    
                    1 Reply Last reply
                    1

                    • Login

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • Users
                    • Groups
                    • Search
                    • Get Qt Extensions
                    • Unsolved