窥视QTextStream
为了创建一个高效的标记器,我想查看读取QFile的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 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;
}