我想看看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::with ()。它工作得更好,但是pos()是错误的(当文件太大时返回-1 )。
有人能解决这个反复出现的问题吗?提前谢谢你。
发布于 2014-01-28 10:37:48
您可以从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-28 13:45:13
试试QTextStream::autoDetectUnicode。这可能会提前读取设备来执行检测并导致您的问题。
也设置一个编解码器以防万一。
添加到日志中,s.device()->pos()和s.device()->bytesAvailable()来验证这一点。
我查过QTextStream代码了。它看起来总是缓存尽可能多的数据,并且无法禁用这种行为。我原以为它会在设备上使用peek,但它只以贪婪的方式读取。底线是你不能同时使用QTextStream和峰值设备。
https://stackoverflow.com/questions/21401954
复制相似问题