Заглянуть на 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 и пиковое устройство одновременно.

Другие вопросы по тегам