crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> чтение txt файла кусками, чтение и поиск в файле с запоминанием позиции
Aleksei
  опции профиля:
сообщение 12.2.2015, 23:46
Сообщение #1


Студент
*

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

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




Репутация:   0  


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

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

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

подскажите как сделать правильней.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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", может понадобится поиск и других ошибок по этому делаю через поля ввода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 0:13