我想偷看QTextStream读取QFile的下一个字符,以创建有效的 token 生成器。

但是,我没有找到令人满意的解决方案。

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)。

有谁能解决这个反复出现的问题?先感谢您。

最佳答案

您从QIODevice进行窥视,但是随后从QTextStream进行读取,这就是为什么peek仅工作一次的原因。试试这个:

while (!s.atEnd()) {
      ++i;
      qDebug() << "Peek" << i << s.device()->peek(3);
      QByteArray v = s.device()->readLine ();
      qDebug() << "Word" << i << v;
}

不幸的是,QIODevice不支持阅读单个单词,因此您必须自己结合peak和read来完成。

关于qt - 快看QTextStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21401954/

10-09 06:56