QTextStream - 位置方法究竟是什么 return
QTextStream - What exactly does the position method return
我对 QTextStream 使用 pos()
方法计算的内容有疑问。我假设这是字节数,但似乎情况并非如此。
我问的原因是我正在处理文件中的行,一旦读取的行数达到某个任意数字或 stream.atEnd()
为真,我就跳出循环并保存 stream.pos()
到 qint64*
变量。处理完成后,我返回文件并 seek(*filePosition)
返回到我的上一个位置并获取更多数据,直到 stream.atEnd()
为真。这在某种意义上是有效的,可以跟踪我在哪里,但是调用 stream.pos()
非常慢,如 Qt 文档中所述。
我正在尝试的是在以高效方式读取每一行后更新文件位置。但是,它不起作用,当程序返回再次读取文件时,位置不正确,因为它读取的第一行从上次迭代中先前读取的行的中间开始。
这是目前的情况:
QTextStream stream(this);
stream.seek(*filePosition);
int ROW_COUNT = 1;
while (!stream.atEnd()) {
QString row = stream.readLine();
QStringList rowData = row.split(QRegExp(delimiter));
*filePosition += row.toUtf8().size();
/*
processing rowData...
*/
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
break;
}
ROW_COUNT++;
}
/*
close files, flush stream, more processing, etc...
*/
QTextStream::pos
returns 字节位置。我看到以下问题:
- 您没有考虑行结束字符(或 2 个字符)
- 在 UTF-8 中,单个字符可能需要超过 1 个字节
还有,为什么读完每一行都要保存缓冲区位置?这可能会更快:
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
*filePosition = stream.pos();
break;
}
解决方案是在函数外部创建 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...
*/
}
...
}
我对 QTextStream 使用 pos()
方法计算的内容有疑问。我假设这是字节数,但似乎情况并非如此。
我问的原因是我正在处理文件中的行,一旦读取的行数达到某个任意数字或 stream.atEnd()
为真,我就跳出循环并保存 stream.pos()
到 qint64*
变量。处理完成后,我返回文件并 seek(*filePosition)
返回到我的上一个位置并获取更多数据,直到 stream.atEnd()
为真。这在某种意义上是有效的,可以跟踪我在哪里,但是调用 stream.pos()
非常慢,如 Qt 文档中所述。
我正在尝试的是在以高效方式读取每一行后更新文件位置。但是,它不起作用,当程序返回再次读取文件时,位置不正确,因为它读取的第一行从上次迭代中先前读取的行的中间开始。
这是目前的情况:
QTextStream stream(this);
stream.seek(*filePosition);
int ROW_COUNT = 1;
while (!stream.atEnd()) {
QString row = stream.readLine();
QStringList rowData = row.split(QRegExp(delimiter));
*filePosition += row.toUtf8().size();
/*
processing rowData...
*/
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
break;
}
ROW_COUNT++;
}
/*
close files, flush stream, more processing, etc...
*/
QTextStream::pos
returns 字节位置。我看到以下问题:
- 您没有考虑行结束字符(或 2 个字符)
- 在 UTF-8 中,单个字符可能需要超过 1 个字节
还有,为什么读完每一行都要保存缓冲区位置?这可能会更快:
if (ROW_COUNT == ROW_UPLOAD_LIMIT) {
*filePosition = stream.pos();
break;
}
解决方案是在函数外部创建 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...
*/
}
...
}