5

我想查看读取 QFile 的 QTextStream 的下一个字符,以创建一个有效的标记器。

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

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

有没有人可以解决这个反复出现的问题?先感谢您。

4

2 回答 2

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不支持阅读单个单词,因此您必须自己结合峰值和阅读来完成。

于 2014-01-28T10:37:48.040 回答
0

尝试禁用QTextStream::autoDetectUnicode. 这可能会提前读取设备以执行检测并导致您的问题。

还设置一个编解码器以防万一。

添加到日志s.device()->pos()s.device()->bytesAvailable()进行验证。


我检查了 QTextStream 代码。看起来它总是尽可能多地缓存数据,并且无法禁用此行为。我期待它会在设备上使用 peek,但它只会以贪婪的方式读取。底线是您不能同时使用QTextStream和峰值设备。

于 2014-01-28T13:45:13.217 回答