2011-06-17 83 views
1

那么这个问题相当复杂。我正在用调试器中看到的简化它。QIODevice首先用QDataStream读取ReadPastEnd

QFile file(fileName); 
file.open(QIODevice::WriteOnly); 
QDataStream psudoStream(&file); 
psudoStream.setVersion(QDataStream::Qt_4_7); 
psudoStream << *packet;// Data is being serialized Properly as I can see The File in Hex Editor 
file.close(); 
QFile file1(fileName); 
file1.open(QIODevice::ReadOnly); 
QDataStream pS(&file); 
pS.setVersion(QDataStream::Qt_4_7); 
DG::MouseEventsPacket* msd = new DG::MouseEventsPacket; 
qDebug() << pS.device()->size() << pS.device()->pos(); 
pS >> *msd;//But the Problem Starts from Here 
file1.close(); 

DG :: MouseEventsPacket继承DG :: Packet。并且DG :: Packet对于QDataStream具有< <和>>运算符重载。 DG :: Packet序列化或Unserializedits数据,然后调用this-> serialize()或unserialize(),这是纯虚拟传递它的流。

qDebug() << pS.device()->size() << pS.device()->pos(); 
pS >> *msd; 

这两条线在终端打印156 0。确认有156字节可用并且当前查找位置在文件的开头。

然后将呼叫转至

QDataStream& DG::operator>>(QDataStream& stream, Packet& packet){ 
    int _type; 
    stream >> packet._state >> _type; 
    packet._type = (DG::Packet::PacketType)_type; 
    return packet.unserialize(stream); 
} 

packet._state是quint32和呼叫转到

QDataStream &QDataStream::operator>>(qint32 &i){ 
i = 0; 
CHECK_STREAM_PRECOND(*this) 
if (dev->read((char *)&i, 4) != 4) { 
    i = 0; 
    setStatus(ReadPastEnd); 
} else { 
    if (!noswap) { 
     i = qbswap(i); 
    } 
} 
return *this; 
} 

这里,电话将转入如果。它确实setStatus(ReadPastEnd);.但为什么 ?它在酝酿中。和pos()返回0,并且还有156个字节要读取。

回答

2

因为你正在做的

QDataStream pS(&file); 

应该

QDataStream pS(&file1); 
+0

哦!天哪!!!!! – 2011-06-17 08:44:57