Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
窥视QTextStream_Qt_Seek_Peek_Qtextstream - Fatal编程技术网

窥视QTextStream

窥视QTextStream,qt,seek,peek,qtextstream,Qt,Seek,Peek,Qtextstream,为了创建一个高效的标记器,我想查看读取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())

为了创建一个高效的标记器,我想查看读取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;
}
我尝试了几个实现,也使用了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;
}
while(!s.atEnd()){
++一,;
qDebug()尝试。这可能会读取设备前方的信息以执行检测,并导致您的问题

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

添加到日志
s.device()->pos()
s.device()->bytesavable()
以验证这一点。

我已经检查过了。它看起来总是尽可能多地缓存数据,并且没有办法禁用此行为。我本来希望它将使用peek on device,但它只是以贪婪的方式读取。底线是,您不能同时使用
QTextStream
和peak device。

感谢您的关注。我编写的示例是Extra我简化了。在我的具体示例中,我对集中使用QTextStream::operator>>很感兴趣。问题确实是QTextStream::device()没有与QTextStream同步。并且QTextStream上没有直接的窥视函数。这是真的,但因为在QIODevice和pos()中没有读取单词的方法如果存在错误,我的建议是自己为QIODevice实现逐字阅读,并使用它而不是QTextStream::operator>>。或者它必须是此运算符的原因是什么?是的,你完全正确。事实上,在讨论过程中,我选择并实现了此解决方案:-)使用QTextStream编写简单的d好看的代码。遗憾的是,这个类中没有peek函数,破坏了使用这个类编写真正的标记器的可能性(在这个类中,peek需要解析一种不明确的语言)@FabienRohrer IIRC,QTextStream要么读取成功,要么保持输入不受干扰。因此,尝试(比如)读取一个数字应该可以,如果失败,则可以读取一个字。添加到日志
s.device()->pos()
s.device()->bytesavable()
检查设备读取进度。这可能有助于定位问题。在第一个QTextStream::operator>>:(pos=0,bytesAvailable=27)之前。在它之后直到结束:(pos=27,bytesAvailable=0)。Qt的错误行为似乎确实相关。我已经检查过了。它看起来总是尽可能多地缓存数据,并且没有办法禁用此行为。我本来希望它将使用peek on device,但它只以贪婪的方式读取。底线是,在这种情况下,您不能使用
QTextStream
。是的。我还尝试设置了QTextStream和QFile未缓冲(从构造函数中),但也没有帮助。我的意见是缺少像QTextStream::peek(int size)这样的函数。我尝试了QTextStream::setAutoDetectionCode(bool)与QTextStream::setCodec(“UTF-8”)的所有组合,但问题仍然存在
while (!s.atEnd()) {
      ++i;
      qDebug() << "Peek" << i << s.device()->peek(3);
      QByteArray v = s.device()->readLine ();
      qDebug() << "Word" << i << v;
}