crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Aleksei
  опции профиля:
сообщение 12.2.2015, 23:46
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


задача открыть лог файл и найти в нём строку, выдать сообщение. Так как лог файл обновляется постоянно, то я буду по таймеру запускать поиск. Файл можно открыть только для чтения.
Товарищ FireBlack подсказал: "читаете его кусками и ищете искомую запись. Если, как Вы говорите, это большой лог файл (который только дополняется), то имеет смысл запоминать последнюю позицию и при следующем чтении файла начинать с нее."
Но как это сделать я так и не понял, как работать с qt документацией? примеров не нашёл.
Читаю книгу ООП Лафоре.

так как не знаю как пользоваться этой подсказкой, пока придумал такую реализацию:
- открою файл для чтения, сделаю поиск строки, выдаст сообщение если найдёт, посчитаю кол-во строк в файле, запомню в переменной номер последней строки, закрою файл.
- по таймеру открою опять файл, из переменной возьму последнюю строку +1 и с этой строки буду опять искать, что бы не искать заново по всему файлу.
ещё можно сделать проверку перед запуском поиска изменился ли файл, либо по его размеру, либо опять же по кол-ву строк определять. Если файл не изменился выдать предупреждение, что возможно повисла программа которая пишет в лог файл.

смущает что лог файл большой и очень много строк будет, наверно мой способ будет медленный.

подскажите как сделать правильней.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V   1 2 3 >  
Начать новую тему
Ответов (1 - 29)
Trisch
  опции профиля:
сообщение 13.2.2015, 1:50
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


В принципе, алгоритм верный.

Для открытия файла и поиска строки понадобятся такие библиотеки QFile, QTextStream, QIODevice.

Для того чтобы узнать был ли изменен файл можно воспользоваться библиотекой QFileInfo.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.2.2015, 9:16
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
запомню в переменной номер последней строки

Лучше запоминайте позицию в файле, потом сделаете seek(товарищ FireBlack все верно говорит)
А как найти строку с номером, не перечитывая файл с начала я даже не знаю.

Цитата
Но как это сделать я так и не понял, как работать с qt документацией? примеров не нашёл.

Читайте detailed description класса, который хотите использовать, там обычно есть пример использования.

Цитата
либо по его размеру

Еще лучше, запоминайте размер, и если он изменился, делайте seek на размер + 1. Тогда и позицию не надо будет хранить.

Цитата
смущает что лог файл большой и очень много строк будет, наверно мой способ будет медленный.

Пусть не смущает. Пока не попробуете, не узнаете и никто вам не скажет :lol:

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 13.2.2015, 13:53
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 13.2.2015, 10:16) *
Цитата
запомню в переменной номер последней строки
Лучше запоминайте позицию в файле, потом сделаете seek(товарищ FireBlack все верно говорит)
А как найти строку с номером, не перечитывая файл с начала я даже не знаю.

Как запомнить позицию?
хм не знаю, если даже прога и перечитает файл сначала, то поиск будет идти только с новых строк.

В detailed description:
Sequential devices don't support seeking to arbitrary positions. The data must be read in one pass. The functions pos() and size() don't work for sequential devices. QTcpSocket and QProcess are examples of sequential devices.
Гугл перевод:
Последовательные устройства не поддерживает поиск в произвольные положения. Данные должны быть считаны за один проход. Функции pos() и size() не работают для последовательных устройств. QTcpSocket и QProcess примеры последовательных устройств.

Получается считывает тоже весь файл?

вроде так:
buffer.open(QIODevice::WriteOnly);
buffer.seek(3);
начнет после 3 символа.
а как в pos() передать последнюю позицию (конец файла)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 16.2.2015, 23:24
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


разобрался с проверкой изменения файла, конечно потом будет по таймеру но пока по клику на кнопку:
QFileInfo info3(_file);                                              // тут сам файл
    if (raz1.isEmpty()==true)                                    
        raz1=info3.lastModified().toString();                 // записали дату изменения
    if (raz1 == info3.lastModified().toString())            //  сравниваем с предыдущей проверкой
        {
            ui->statusBar->showMessage("Файл не изменился",6000);
            ui->textEdit->setText(info3.lastModified().toString());
        }
    else
        {
            ui->statusBar->showMessage("Файл изменился",6000);
            ui->textEdit->setText(info3.lastModified().toString());
        }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 16.2.2015, 23:41
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Получается считывает тоже весь файл?

Нет, файл это не последовательное устройство.

Цитата
Как запомнить позицию?

qint64 pos = file.size();

Цитата
хм не знаю, если даже прога и перечитает файл сначала, то поиск будет идти только с новых строк.

Это почему это?

Цитата
buffer.open(QIODevice::WriteOnly);

Открыть файл только для записи. Нужно для чтения.

Цитата
а как в pos() передать последнюю позицию (конец файла)?

file.seek(pos)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 17.2.2015, 0:38
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 17.2.2015, 0:41) *
Цитата
хм не знаю, если даже прога и перечитает файл сначала, то поиск будет идти только с новых строк.
Это почему это?

спасибо, буду пробовать.
А по вопросу: потому что хотел посчитать строки и при следующем запуске, поиск начинать со следующей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 18.2.2015, 9:28
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


изучаю дальше и немного добавляю полезность в свою программу.
void MainWindow::on_svoistvaButton_clicked() //инфа о файле
{
        QFileInfo info(_file);
        ui->label->setText("Имя файла: " + info.fileName());
        ui->label_2->setText("Размер файла: " + QString::number(info.size()/1024) + " Кб");
        ui->label_3->setText("Дата изменения: " + info.lastModified().toString());
} 
void MainWindow::on_changeButton_clicked()  // изменился ли файл
{
    QFileInfo info3(_file);
    if (raz1.isEmpty()==true)
        raz1=info3.lastModified().toString();
    if (raz1 == info3.lastModified().toString())
        {
          QMessageBox::critical(this, tr("ВНИМАНИЕ!!!"),
          tr("Файл давно не менялся!\n"));
        }
    else
        {
            ui->statusBar->showMessage("Файл изменился",6000);
            ui->textEdit->setText(info3.lastModified().toString());
            raz1=info3.lastModified().toString();
        }
}
void MainWindow::on_lineEdit_textEdited(const QString &arg1)  // если нет текста то кнопка не активна
{
    if(arg1.isEmpty()){
            ui->seachButton_4->setEnabled(false);
        }else{
            ui->seachButton_4->setEnabled(true);
        }
}


теперь ищу информацию как сделать поиск в файле.
вопрос: буду делать поиск введённого слова в lineEdit есть ли разница если искать число а не текст.
вообще программа задумывается как поиск числа 500 в файле, если есть выдать сообщение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.2.2015, 20:02
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
теперь ищу информацию как сделать поиск в файле.

Оберните файл в QTextStream, читайте readLine, запоминайте позицию, делайте seek, так же как и с файлом.

Цитата
вопрос: буду делать поиск введённого слова в lineEdit есть ли разница если искать число а не текст.

Если файл бинарный, тогда в нем не получится искать текст, только числа, если текстовый, то наоборот.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 19.2.2015, 22:09
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 18.2.2015, 21:02) *
Если файл бинарный, тогда в нем не получится искать текст, только числа, если текстовый, то наоборот.

можно по подробней?
файл текстовый (*.txt), ошибка будет выглядеть примерно так "дата время error = 500 а=1-2-3"
хочу искать "500", может понадобится поиск и других ошибок по этому делаю через поля ввода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 20.2.2015, 14:06
Сообщение #11


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
можно по подробней?

Если файл текстовый, то число это просто набор символов 5, 0 и 0 поэтому и искать надо строку "500"
А если файл бинарный, то число это набор байт 0x01 0xf4, причем как количество байт в записи числа, так и их порядок могут быть разные и это надо учитывать при чтении.
Если быть совсем занудой, можно сказать что текстовый файл тоже бинарный, просто каждый его байт(или группа байт в случае юникода) представляет собой один символ.

Искать примерно так:
QFile file(...);
file.open(...);
QTextStream stream(&file); 
stream.seek(pos);
while(...) {
  QString line = stream.readLine();
  if( line.indexOf( "500" ) != -1 ) {
   // найдено
  } else {
   // ненайдено
  }
}

Единственно о чем помнить, сохранять позицию только в конце строки (где есть перевод строки), потому что если сначала считаете файл
"дата время error = 5"
А потом продолжите поиск с 0
"00 а=1-2-3", то ничего не найдется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 20.2.2015, 19:53
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


сделал пока поиск без позиций
void MainWindow::on_seachButton_4_clicked() //поиск
{
    if(!_file.isOpen() && !_file.open(QFile::ReadOnly | QFile::Text))
        {
           QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
           return;
        }
          QString line;
          QString err = ui->lineEdit->text();
          QTextStream stream(&_file);
          while (!stream.atEnd())
           {
              line = stream.readLine();
              if (line.contains(err))
                {
                   ui->statusBar->showMessage("НАШЁЛ",5000);
                }
            else
                {
                   ui->statusBar->showMessage("Не найдено",5000);
                }
          }

              _file.close();
   
}

всё ли логично и правильно?
теперь буду пробовать с позициями.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 20.2.2015, 21:07
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


не пойму, что случилось, только что искал как надо.
стал пробовать с позициями потом строки с позициями закоментил, пробую просто поиск из предыдущего поста и он не работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 20.2.2015, 23:37
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


поиск работает не верно ищет только в последней строке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 21.2.2015, 13:24
Сообщение #15


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Казнить нельзя помиловать :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 24.2.2015, 22:36
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


решил по другому сделать прогу.
поиск так и не заработал, ищет только в последней строке файла.
решил пока разобраться с таймером
для теста сделал так:
void MainWindow::on_startButton_clicked()
{
    ui->statusBar->showMessage("Нажата кнопка старт",2000);
    connect(&timer, SIGNAL(timeout()), this, SLOT(pusk()));
    timer.start(4000);
}
void MainWindow::pusk()
{
    ui->statusBar->showMessage("Нажата кнопка старт",2000);
}

void MainWindow::on_stopButton_clicked()
{
    timer.stop();
}


вроде всё работает, но при запуске QT в проблемах пишет:
FTH: (4800): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes. ***
что не так?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 24.2.2015, 23:27
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


пробовал оставить одну кнопку с выводом сообщения в статус бар, такая же ошибка.
упростил :D
void MainWindow::on_startButton_clicked()
{
    pusk();
    connect(&timer, SIGNAL(timeout()), this, SLOT(pusk()));
    timer.start(4000);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 25.2.2015, 11:48
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


сегодня этой ошибки уже нет.
добавил виджет QProgressBar, как сделать чтобы то время которое светится текст в ui->statusBar->showMessage("Нажата кнопка старт",2000); отображалось в QProgressBar.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 25.2.2015, 21:44
Сообщение #19


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


http://qt-project.org/doc/qt-4.8/qprogress...tml#format-prop
Если я все правильно понял.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 26.2.2015, 9:10
Сообщение #20


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 25.2.2015, 22:44) *
http://qt-project.org/doc/qt-4.8/qprogress...tml#format-prop
Если я все правильно понял.

спасибо но я не понял как этим воспользоватся.
в принципе в моей программе ProgressBar будет заполнятся при поиске. Нужно с начало с поиском разобраться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 27.2.2015, 1:05
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Переделал.

void MainWindow::on_action_triggered()  //выбор файла
{
    QString fileName = QFileDialog::getOpenFileName(this, "Выбрать файл", "", "*.txt");
        if(!fileName.isEmpty())
         {
            QFileInfo info(fileName);
            ui->label_file->setText("Выбран файл: " + info.fileName());
            ui->startButton->setEnabled(true);
            _file.setFileName(fileName);
         }
        else
           {
            QMessageBox::information(this, "Ошибка", "Для начала нужно выбрать файл");
            ui->label_file->setText("Выбран файл:");
           }
        return;
}

void MainWindow::on_startButton_clicked() //кнопка старт поиска
{
    ui->stopButton->setEnabled(true);
    pusk();

}

void MainWindow::pusk()  //функция поиска
{
    ui->statusBar->showMessage("Нажата кнопка старт",1000);
    if(!_file.isOpen() && !_file.open(QFile::ReadOnly | QFile::Text))
        {
           QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
           return;
        }
           QString text = ui->lineEdit->text();
           QString line;
           QTextStream in(&_file);
          while (!in.atEnd())
          {   line = in.readLine();
              if (line.contains(text))
              {
                  ui->statusBar->showMessage("НАШЁЛ",4000);
                  ui->textEdit->setText(line);
              }
           
      }
      _file.close();
}


Поиск заработал, выводит строку в которой нашёл.
Но если в тексте 400 или 40000, а я ищу 4 или 40 то он находит эту строку, как задать что бы правильно работало?
Также если в тексте несколько строк с нужным текстом, то он отображает только последнюю, как тут быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 27.2.2015, 9:30
Сообщение #22


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
Но если в тексте 400 или 40000, а я ищу 4 или 40 то он находит эту строку, как задать что бы правильно работало?

Используйте регулярные выражения:
http://qt-project.org/doc/qt-4.8/qregexp.html
Цитата
Также если в тексте несколько строк с нужным текстом, то он отображает только последнюю, как тут быть?

Но находит все, просто
ui->textEdit->setText(line);

заменяет весь текст на каждую следующую найденную строку
используйте append
http://doc.qt.io/qt-5/qtextedit.html#append
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 1.3.2015, 0:43
Сообщение #23


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


не могу найти как сделать что бы выводил (сверял) именно то число которое ввёл пользователь.
если ограничить {3} тремя символами, то это будет неправильно, ведь пользователь может захотеть искать и двухзначное число.
QRegExp rx("[0-9]{1,4}");

результат решил выводить через List, теперь не затирает.
ui->listWidget->addItem(rx.cap(0));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 1.3.2015, 9:40
Сообщение #24


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


идея:
1) Можно найти длину строки вводимой в поиск и передать длину в QRegExp rx
или
2) Проверить в найденном элементе, является ли следующий символ пробел (пустой).

Как в посимвольном поиске сдвигают каретку на шаг. Можно ли тут так использовать. И какой из вариантов лучше?

Сообщение отредактировал Aleksei - 1.3.2015, 9:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 1.3.2015, 12:25
Сообщение #25


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Зачем так сложно? Используйте последовательность \b
http://www.regular-expressions.info/wordboundaries.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 2.3.2015, 15:03
Сообщение #26


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 1.3.2015, 13:25) *
Зачем так сложно? Используйте последовательность \b
http://www.regular-expressions.info/wordboundaries.html

QRegExp rx (ui->lineEdit->text()+"\\b");
так?
вроде работает.

только в результат выдаёт то число, что мы искали, а мне нужно строку в которой нашли.

Сообщение отредактировал Aleksei - 2.3.2015, 15:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 2.3.2015, 16:11
Сообщение #27


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Что то вроде:
.*\\b500\\b.*

Еще можно маркеры начала/конца добавить по вкусу или \n
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 2.3.2015, 17:27
Сообщение #28


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


lanz, с тобой можно пообщаться? skype или icq
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 3.3.2015, 0:33
Сообщение #29


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


нашёл как сделать по другому
void MainWindow::pusk()  //функция сообщения
{
    ui->statusBar->showMessage("Нажата кнопка старт",1000);
    if(!_file.isOpen() && !_file.open(QFile::ReadOnly | QFile::Text))
        {
           QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
           return;
        }
               QRegExp rx ("\\b"+ ui->lineEdit->text()+"\\b");
               QTextStream in(&_file);
               QString line = in.readAll();

               int pos = 0;
              while ((pos = rx.indexIn(line, pos)) != -1)
              {
                  if (line.contains(ui->lineEdit->text()))
                  {
                    ui->statusBar->showMessage("НАШЁЛ",4000);
                   ui->listWidget->addItem(rx.cap(0));
                   pos += rx.matchedLength();
                   ui->listWidget_2->addItem(QString::number(pos));
                  }
                  else
                   {
                      ui->statusBar->showMessage("НЕ НАШЁЛ",4000);
                   }

              }
     _file.close();
}


так как я считываю весь файл .*\\b500\\b.* выдаёт весь файл всё сразу.

или лучше считывать построчно?
что будет быстрей и менее нагружать комп?

Сообщение отредактировал Aleksei - 3.3.2015, 1:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 5.3.2015, 22:31
Сообщение #30


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


рабочий поиск без позиций
 QTextStream stream(&_file);
   QRegExp rx ("\\b"+ ui->lineEdit->text()+"\\b");
     while (!stream.atEnd())
    {
      QString line = stream.readLine();
      if((line.indexOf(rx)) != -1 )
      {
          ui->statusBar->showMessage("НАШЁЛ",4000);
          ui->listWidget->addItem(line); // печатает полностью строку где удовлетворительное условие
       }
   }
     _file.close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 11:16