我对QTextStream使用pos()
方法计算的内容有疑问。我假设它是字节数,但似乎可能不是这种情况。
我问的原因是,我正在处理文件中的行,一旦读取的行数达到任意数字或stream.atEnd()
为真,我就会跳出循环并保存{{1}转到stream.pos()
变量。处理完成后,我将返回文件并qint64*
返回到我的上一个位置并获取更多数据,直到seek(*filePosition)
为真。这可以跟踪我的位置,但调用stream.atEnd()
非常慢,如Qt文档中所述。
我正在尝试的是在以有效的方式读取每一行之后更新文件位置。但是,它不起作用,当程序返回再次读取文件时,位置不正确,因为它读取的第一行在上一次迭代中先前读取的行的中间开始。
到目前为止:
stream.pos()
答案 0 :(得分:2)
QTextStream::pos
以字节为单位返回位置。我看到以下问题:
另外,为什么在读取每一行后保存缓冲区位置?这可能会更快:
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
*filePosition = stream.pos();
break;
}
答案 1 :(得分:0)
解决方案是在函数外部创建QTextStream
并将其作为参数传递。这样做可以让我不必担心在每次迭代时跟踪位置,因为我将流保持在范围内,直到我完全处理完文件为止。
class FeedProcessor {
...
void processFeedFile() {
IntegrationFile file("big_file.txt");
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream stream(&file);
while(!stream.atEnd()) {
file.extractFileContents(&stream);
/*
do more processing with file
*/
}
}
...
}
class IntegrationFile : public QFile {
...
void extractFileContents(QTextStream* stream) {
int ROW_COUNT = 1;
while (!stream.atEnd()) {
QString row = stream.readLine();
QStringList rowData = row.split(QRegExp(delimiter));
/*
processing rowData...
*/
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
break;
}
ROW_COUNT++;
}
/*
close files, flush stream, more processing, etc...
*/
}
...
}