Russian Qt Forum

Qt => Общие вопросы => Тема начата: gaara от Февраль 04, 2009, 16:35



Название: прочитать последние 4 строки из файлы
Отправлено: 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, но если файл очень большой, это ведь долго будет...


Название: Re: прочитать последние 4 строки из файлы
Отправлено: Rcus от Февраль 04, 2009, 16:47
Досчитай до 100!
1 2 3..
Быстрее!
98 99 100!

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

Что мешает читать файл кусками с конца и считать строки? :)


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 04, 2009, 16:49
вот-вот.. я ж об этом.. просто не знаю как читать файл кусками с конца.. подскажите, если не сложно..


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 04, 2009, 16:52
уточню.. QT 3.3


Название: Re: прочитать последние 4 строки из файлы
Отправлено: developer от Февраль 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 ()- которая возвращает размер файла в байтах.


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 04, 2009, 17:11
мммм.. вот к примеру файл текстовый, в нем строки разной длины, в одной 10 символов, в другой 100.. как мне прочитать последние 4 строки? от конца файла читать по одному символу назад и ждать, пока не насоберется 4 "\n"?


Название: Re: прочитать последние 4 строки из файлы
Отправлено: developer от Февраль 04, 2009, 17:30
как один из вариантов


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 04, 2009, 17:36
а можете подсказать другие варианты? и с помощью каких классов можно так делать? не могу найти в QTextStream функцию для установки позиции в определенное место файла..


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


Название: Re: прочитать последние 4 строки из файлы
Отправлено: developer от Февраль 04, 2009, 19:25
Кстати тебе не нужно использовать QTextStream, QFile имеет ту же функциональность


Название: Re: прочитать последние 4 строки из файлы
Отправлено: BRE от Февраль 05, 2009, 01:13
QTextStream также имеет функцию seek(),  ее можно использовать, также QTextStream имеет функцию readLine(), алгоритм приблизительно такой
читаем файл с помощью функции readLine(), пока не встретится atEnd() (тоесть while not atEnd()), и запоминать только четире строки припустим в QStringList- readLine() возвращает строку, ее и можно запоминать, и когда проход окончится етот QStringList и возвращаем - но тут нужно придумать еще как в етот QStringLIst загнать только 4 строки, и постоянно их обновлять.
За сообщение зачОт!
 ;)


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 05, 2009, 10:03
Цитировать
читаем файл с помощью функции readLine(), пока не встретится atEnd() (тоесть while not atEnd()), и запоминать только четире строки

мда :) допустим файлик текстовый весит 40-50 метров (к примеру, 150 000 строк)... сколько времени займет такой поиск последних четырех строк?


Название: Re: прочитать последние 4 строки из файлы
Отправлено: BRE от Февраль 05, 2009, 10:12
мда :) допустим файлик текстовый весит 40-50 метров (к примеру, 150 000 строк)... сколько времени займет такой поиск последних четырех строк?
В первом приближении, я бы не заморачивался и читал файл с конца по-символьно. Все равно операционка будет его читать блоками и закеширует их у себя в буферах.


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 05, 2009, 10:16
Цитировать
В первом приближении, я бы не заморачивался и читал файл с конца по-символьно.

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


Название: Re: прочитать последние 4 строки из файлы
Отправлено: BRE от Февраль 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.


Название: Re: прочитать последние 4 строки из файлы
Отправлено: Rcus от Февраль 05, 2009, 10:20
ага, только в одной теме уже упоминали что позиция устанавливается смещением в байтах, поэтому для многобайтных кодировок нужно обрабатывать исключительные случаи.


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 05, 2009, 10:33
Код
C++ (Qt)
QTextStream stream( &file );
stream.seek(1000000);

пишет,
Цитировать
'seek' : is not a member of 'QTextStream'
или я неправильно пишу?


Название: Re: прочитать последние 4 строки из файлы
Отправлено: Rcus от Февраль 05, 2009, 10:51
Qt 3.3 doh
тогда ::device()->at(pos)


Название: Re: прочитать последние 4 строки из файлы
Отправлено: gaara от Февраль 05, 2009, 11:15
спасибо! :) то что надо... теперь моментом загружается... ))