我想查看读取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)。
有没有人能解决这个经常出现的问题?提前谢谢。
答案 0 :(得分:2)
你从QIODevice
偷看,但是你从QTextStream
读取,这就是为什么偷看只有一次。试试这个:
while (!s.atEnd()) {
++i;
qDebug() << "Peek" << i << s.device()->peek(3);
QByteArray v = s.device()->readLine ();
qDebug() << "Word" << i << v;
}
不幸的是,QIODevice
不支持阅读单个单词,因此您必须自己使用峰值和读取的组合。
答案 1 :(得分:0)
试试disable QTextStream::autoDetectUnicode
。这可能会提前读取设备以执行检测并导致您的问题。
设置一个编解码器以防万一。
添加到日志s.device()->pos()
和s.device()->bytesAvailable()
以验证。
QTextStream
和峰值设备。