Russian Qt Forum
Ноябрь 25, 2024, 13:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: прочитать последние 4 строки из файлы  (Прочитано 12915 раз)
gaara
Гость
« : Февраль 04, 2009, 16:35 »

Добрый день!

Подскажите, как можно прочитать последние 4 строки из файла?

Читаю таким образом

Код
C++ (Qt)
    QFile file( FilePath );
    if ( file.open( IO_ReadOnly ) ) {
       QTextStream stream( &file );
       while ( !stream.atEnd() ) {
           line = stream.readLine();
       }
       file.close();
    }

можно конечно все прочитать в стринглист, а потом из него извлечь последние 4, но если файл очень большой, это ведь долго будет...
Записан
Rcus
Гость
« Ответ #1 : Февраль 04, 2009, 16:47 »

Досчитай до 100!
1 2 3..
Быстрее!
98 99 100!

/*собственно о чем это я*/

Что мешает читать файл кусками с конца и считать строки? Улыбающийся
Записан
gaara
Гость
« Ответ #2 : Февраль 04, 2009, 16:49 »

вот-вот.. я ж об этом.. просто не знаю как читать файл кусками с конца.. подскажите, если не сложно..
Записан
gaara
Гость
« Ответ #3 : Февраль 04, 2009, 16:52 »

уточню.. QT 3.3
Записан
developer
Гость
« Ответ #4 : Февраль 04, 2009, 17:08 »

класс QFile имеет функцию pos()
Цитировать
qint64 QIODevice::pos () const   [virtual]
For random-access devices, this function returns the position that data is written to or read from. For sequential devices or closed devices, where there is no concept of a "current position", 0 is returned.
The current read/write position of the device is maintained internally by QIODevice, so reimplementing this function is not necessary. When subclassing QIODevice, use QIODevice::seek() to notify QIODevice about changes in the device position.
. Тоесть делаеш сначала pos(твоя позиция в файле), и потом начинаеш зчитывать до EOF(конец файла). Есть функция size ()- которая возвращает размер файла в байтах.
Записан
gaara
Гость
« Ответ #5 : Февраль 04, 2009, 17:11 »

мммм.. вот к примеру файл текстовый, в нем строки разной длины, в одной 10 символов, в другой 100.. как мне прочитать последние 4 строки? от конца файла читать по одному символу назад и ждать, пока не насоберется 4 "\n"?
Записан
developer
Гость
« Ответ #6 : Февраль 04, 2009, 17:30 »

как один из вариантов
Записан
gaara
Гость
« Ответ #7 : Февраль 04, 2009, 17:36 »

а можете подсказать другие варианты? и с помощью каких классов можно так делать? не могу найти в QTextStream функцию для установки позиции в определенное место файла..
Записан
developer
Гость
« Ответ #8 : Февраль 04, 2009, 19:22 »

QTextStream также имеет функцию seek(),  ее можно использовать, также QTextStream имеет функцию readLine(), алгоритм приблизительно такой
читаем файл с помощью функции readLine(), пока не встретится atEnd() (тоесть while not atEnd()), и запоминать только четире строки припустим в QStringList- readLine() возвращает строку, ее и можно запоминать, и когда проход окончится етот QStringList и возвращаем - но тут нужно придумать еще как в етот QStringLIst загнать только 4 строки, и постоянно их обновлять.
Записан
developer
Гость
« Ответ #9 : Февраль 04, 2009, 19:25 »

Кстати тебе не нужно использовать QTextStream, QFile имеет ту же функциональность
Записан
BRE
Гость
« Ответ #10 : Февраль 05, 2009, 01:13 »

QTextStream также имеет функцию seek(),  ее можно использовать, также QTextStream имеет функцию readLine(), алгоритм приблизительно такой
читаем файл с помощью функции readLine(), пока не встретится atEnd() (тоесть while not atEnd()), и запоминать только четире строки припустим в QStringList- readLine() возвращает строку, ее и можно запоминать, и когда проход окончится етот QStringList и возвращаем - но тут нужно придумать еще как в етот QStringLIst загнать только 4 строки, и постоянно их обновлять.
За сообщение зачОт!
 Подмигивающий
Записан
gaara
Гость
« Ответ #11 : Февраль 05, 2009, 10:03 »

Цитировать
читаем файл с помощью функции readLine(), пока не встретится atEnd() (тоесть while not atEnd()), и запоминать только четире строки

мда Улыбающийся допустим файлик текстовый весит 40-50 метров (к примеру, 150 000 строк)... сколько времени займет такой поиск последних четырех строк?
Записан
BRE
Гость
« Ответ #12 : Февраль 05, 2009, 10:12 »

мда Улыбающийся допустим файлик текстовый весит 40-50 метров (к примеру, 150 000 строк)... сколько времени займет такой поиск последних четырех строк?
В первом приближении, я бы не заморачивался и читал файл с конца по-символьно. Все равно операционка будет его читать блоками и закеширует их у себя в буферах.
Записан
gaara
Гость
« Ответ #13 : Февраль 05, 2009, 10:16 »

Цитировать
В первом приближении, я бы не заморачивался и читал файл с конца по-символьно.

я тоже так думаю.. а вот подскажите, точно ли есть seek() у QTextStream? я ищу в хелпе и никаких таких методов не вижу.. сорри за глупые вопросы, пишу на другом языке, просто вот понадобилось кое-что в программе, написанной на си с использованием qt переделать..
Записан
BRE
Гость
« Ответ #14 : Февраль 05, 2009, 10:19 »

Цитировать
В первом приближении, я бы не заморачивался и читал файл с конца по-символьно.

я тоже так думаю.. а вот подскажите, точно ли есть seek() у QTextStream? я ищу в хелпе и никаких таких методов не вижу.. сорри за глупые вопросы, пишу на другом языке, просто вот понадобилось кое-что в программе, написанной на си с использованием qt переделать..
Конечно есть.

bool QTextStream::seek ( qint64 pos )
Seeks to the position pos in the device. Returns true on success; otherwise returns false.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.287 секунд. Запросов: 21.