Russian Qt Forum

Qt => Общие вопросы => Тема начата: fulkabaster от Март 05, 2009, 17:26



Название: Чтение файла задом наперёд
Отправлено: fulkabaster от Март 05, 2009, 17:26
Открывается QFile, с ним связывается поток QTextStream, чтение происходит посимвольно ( >> QChar ). Иногда нужно остановить обычное чтение и считать N символов назад, в обратном порядке. Я бы реализовал это примерно так:

QChar sym;
QTextStream in;
...
in.seek( in.pos() +1 );
for (int i=0; i<N; i++) {
 in.seek( in.pos() -2 );
 in >> sym;
}

но может быть существует прямой метод "обратного считывания", без постоянного скакания с помощью seek?


Название: Re: Чтение файла задом наперёд
Отправлено: lit-uriy от Март 05, 2009, 17:43
а уже обсуждалось, название темы не помню, что-то вроде "Чтение файла с конца", поищи.


Название: Re: Чтение файла задом наперёд
Отправлено: fulkabaster от Март 06, 2009, 17:00
Не нашел  :-[ Искал по разным критериям, по всем разделам.


Название: Re: Чтение файла задом наперёд
Отправлено: lit-uriy от Март 06, 2009, 17:11
нашел, но оказывается там про Qt3:
http://www.prog.org.ru/topic_8493_0.html


Название: Re: Чтение файла задом наперёд
Отправлено: Rcus от Март 06, 2009, 17:40
Из поста получается что файл представлен в кодировке ucs2 (utf16 без суррогатных пар). Почему бы тогда не использовать in.seek( in.pos() - 2 * N), а затем считывать методом QString read ( qint64 maxlen ). А затем развернуть результат.


Название: Re: Чтение файла задом наперёд
Отправлено: fulkabaster от Март 06, 2009, 19:13
В файле - текстовые символы. И считывать нужно именно посимвольно, т.к. символы запихиваютс в дек (deque из STL). Причем если чтение идет вперед, то запихиваются с одного конца (push_back(char) ), если назад - с другого конца (push_front(char) ). Поэтому и интересует, есть ли метод прямого считывания в обратном порядке. С QString получтся еще дольше.
(Кстати, почему в контейнерах QT не предусмотрен аналог deque? Вектора и списки есть, а вот деков нет).


Название: Re: Чтение файла задом наперёд
Отправлено: BRE от Март 06, 2009, 19:21
(Кстати, почему в контейнерах QT не предусмотрен аналог deque? Вектора и списки есть, а вот деков нет).
В QList также можно вставлять в начало и конец списка:
void QList::push_front ( const T & value )
void QList::push_back ( const T & value )

+ QLinkedList.