2

我正在为文本文件编写解析器,但 QTextStream 似乎缺少一些东西。我正在使用 Qt 5.4.1,并且代码是单线程的,如果这很重要的话。

这是方法:

const Event* AviLogFile::nextEvent() {                                          
    qDebug() << "Entering nextEvent()";                                         
    qDebug() << "m_file.pos() before QTextStream: " << m_file.pos();            
    QTextStream in(&m_file);                                                    
    qDebug() << "m_file.pos() after QTextStream: " << m_file.pos();             
    qDebug() << "in.pos(): " << in.pos();                                       
    Event* ev = 0;                                                              

    while (!in.atEnd() && ev == 0) {                                            
        QString line = in.readLine();                                           
        qDebug() << "(inside loop) m_file.pos(): " << m_file.pos();             
        qDebug() << "(inside loop) in.pos(): " << in.pos();                     
        ev = parseEvent(line);                                                  
    }                                                                           

    m_currentEvent = ev;                                                        
    if (!ev) {                                                                  
        qDebug() << "in.AtEnd: " << in.atEnd() << ". file.atEnd: " << m_file.atEnd();
    }                                                                           
    return ev;                                                                  
}

我在循环中调用它。第一个调用工作正常,但在第二个调用中,我得到以下输出:

Entering nextEvent()
m_file.pos() before QTextStream:  2244
m_file.pos() after QTextStream:  2244
in.pos():  2244
(inside loop) m_file.pos():  18628
(inside loop) in.pos():  65

如您所见,QTextStream 和 QFile 内部指针在进入循环之前很好,但在循环内部完全搞砸了。

知道这里发生了什么吗?

4

1 回答 1

1

几个关于使用QTextStream::pos() 下面的 IO 设备的固定错误。其中许多是“未解决”或“无法修复”,并且它们的复制器案例看起来与您的问题完全一样。

我建议避免依赖该功能(另外,引用QTextStream的文档:

因为 QTextStream 是缓冲的,所以这个函数可能必须寻找设备来重建一个有效的设备位置。

它还会在您的循环期间使事情变慢)。

更多关于这也可以在这里找到

于 2015-05-19T17:59:01.950 回答