【发布时间】:2014-02-19 12:52:53
【问题描述】:
我想查看读取 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)。
有没有人能解决这个反复出现的问题?提前谢谢你。
【问题讨论】:
-
添加到日志
s.device()->pos()和s.device()->bytesAvailable()以检查设备读取进度。这可能有助于定位问题。 -
在第一个 QTextStream::operator>>: (pos = 0, bytesAvailable = 27) 之前。就在它之后直到结束:(pos = 27,bytesAvailable = 0)。 Qt 的错误行为似乎确实相关
-
我检查了QTextStream code。看起来它总是尽可能多地缓存数据,并且无法禁用此行为。我期待它会在设备上使用 peek,但它只会以贪婪的方式读取。底线是在这种情况下你不能使用
QTextStream。 -
是的。我还尝试将 QTextStream 和 QFile 设置为无缓冲(来自构造函数),但这也无济于事。
-
我的看法是缺少像 QTextStream::peek(int size) 这样的函数。
标签: qt seek peek qtextstream