2011-06-17 158 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