1

我正在使用 linux 平台 (Ubuntu) 和 QT4.7.4 ,

首先,我使用 vi 创建了一个测试文件“test.txt”,只需在其中写入 100000 行“1234567890”,

然后我编译并运行下面的代码,在我的监督下,它进入无限循环,

有什么想法吗?谢谢!

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QString str;

    QFile file("./test.txt");
    if ( file.open(QIODevice::ReadOnly | QIODevice::Text) ) {

        QTextStream ts( &file );
        while(!ts.atEnd()) {
            str = ts.read(10240);
            qDebug()<<"s:"<<ts.status()<<":"<<ts.atEnd()<<":"<<str.count()<<":"<<ts.pos();

        }
    }
    return app.exec();
}

这是 qdebug 输出:

s: 0 : false : 10240 : 10240 
s: 0 : false : 10240 : 20480 
s: 0 : false : 10240 : 51200 
s: 0 : false : 10240 : 112640 
s: 0 : false : 10240 : 235520 
s: 0 : false : 10240 : 481280 
s: 0 : false : 10240 : 972800 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
s: 0 : false : 10240 : -1 
....

这里有一些关于 test.txt 的信息

$du  -sh test.txt 
1.1M    test.txt

$wc -c test.txt 
1100011 test.txt

$du -S test.txt 
1076    test.txt
4

3 回答 3

1

不知何故,您的搜索指针在某处丢失了轨道。这可能是在函数内部调用 seekpos()函数。

所以试着在每次迭代中手动寻找你的指针。我建议在迭代中读取小块数据。

试试这个

       int pos=0;
       QTextStream ts( &file );
       while(!ts.atEnd()) {
           pos+=5120;
           {
               str = ts.read(5120);

               qDebug()<<"s:"<<ts.status()<<":"<<ts.atEnd()<<":"<<str.count()<<":"<<ts.pos();
               ts.seek(pos);//manually seeking to current position
           }

       }

这应该有效。

您将s: 0 : true : (final-chunk-data-size) : (size-of-your-test.txt-file)在 qdebug 输出中看到最后一行。

问题在于ts.pos();由于line qDebug()<<"s:"<<ts.status()<<":"<<ts.atEnd()<<":"<<str.count()<<":"<<ts.pos(); QTextStream 是缓冲的,因此 pos() 函数可能必须寻找设备以重建有效的设备位置。[如果您结合使用 QFile 和 TextStream,文本流的内部位置可能会与文件的位置不同步,这样 pos() 函数内部使用的这个 seek 函数可能会出错!!]

因此,如果您使用它而不调用ts.pos()它就可以了。您不必手动seek. 否则,如果添加 ts.pos(),则应手动添加seek.

查看 pos 输出的顺序,它总是在每次 pos() 调用中将 (10240 + 前一个位置) 添加到前一个位置值。这意味着它在每个 pos() 调用中都会跳跃一定数量的先前位置值,因为它与文件的位置不同步一定数量的先前 pos。因此,如果您调用 pos(),则不同步会反映在您的 texstream 对象中。

于 2012-05-31T04:11:06.223 回答
1

这是 中的一个错误QTextStream::pos,它阻止使用pos()大于 16KB 的文件(我认为),它似乎已在 Qt 4.7 和 4.8 之间修复。

但无论如何,QTextStream::pos()在该循环内使用会严重影响阅读速度,因此,您应该避免使用它。

于 2012-05-31T09:55:51.370 回答
0

您尝试读取的文件似乎有问题。检查 test.txt 的文件编码。如果您看到读取的数据大小,您将看到读取的文本异常,读数从 20K 移动到 50K 再到 100K。

代码很好,对我有用。

于 2012-05-31T05:48:42.213 回答