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 ?
-
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ę. -
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 ? -
@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.
-
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(); }