Заглянуть на QTextStream
Я хотел бы просмотреть следующие символы QTextStream, читающие QFile, для создания эффективного токенизатора.
Тем не менее, я не нахожу никакого удовлетворительного решения для этого.
QFile f("test.txt");
f.open(QIODevice::WriteOnly);
f.write("Hello world\nHello universe\n");
f.close();
f.open(QIODevice::ReadOnly);
QTextStream s(&f);
int i = 0;
while (!s.atEnd()) {
++i;
qDebug() << "Peek" << i << s.device()->peek(3);
QString v;
s >> v;
qDebug() << "Word" << i << v;
}
Дает следующий вывод:
Peek 1 "Hel" # it works only the first time
Word 1 "Hello"
Peek 2 ""
Word 2 "world"
Peek 3 ""
Word 3 "Hello"
Peek 4 ""
Word 4 "universe"
Peek 5 ""
Word 5 ""
Я попробовал несколько реализаций, также с QTextStream::pos() и QTextStream::seek(). Это работает лучше, но pos () глючит (возвращает -1, если файл слишком большой).
У кого-нибудь есть решение этой повторяющейся проблемы? Заранее спасибо.
2 ответа
Вы выглядываете из QIODevice
, но тогда вы читаете из QTextStream
Поэтому Peek работает только один раз. Попробуй это:
while (!s.atEnd()) {
++i;
qDebug() << "Peek" << i << s.device()->peek(3);
QByteArray v = s.device()->readLine ();
qDebug() << "Word" << i << v;
}
К несчастью, QIODevice
не поддерживает чтение отдельных слов, поэтому вам придется делать это самостоятельно с помощью комбинации пика и чтения.
Попробуй отключить QTextStream::autoDetectUnicode
, Это может прочитать устройство впереди, чтобы выполнить обнаружение и вызвать вашу проблему.
Установите также кодек на всякий случай.
Добавить в журналы s.device()->pos()
а также s.device()->bytesAvailable()
чтобы проверить это.
Я проверил код QTextStream. Похоже, что он всегда кэширует как можно больше данных, и нет способа отключить это поведение. Я ожидал, что он будет использовать Peek на устройстве, но он читает только жадным способом. Суть в том, что вы не можете использовать
QTextStream
и пиковое устройство одновременно.