【问题标题】:QIODevice Getting ReadPastEnd on very first read with QDataStreamQIODevice 在第一次使用 QDataStream 读取时获取 ReadPastEnd
【发布时间】:2011-06-17 08:21:09
【问题描述】:

这个问题很复杂。我正在使用我在调试器中看到的内容对其进行简化。

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序列化或者Unserialized它的数据然后调用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;
}

这里调用转到 If 。它确实 setStatus(ReadPastEnd);。但为什么 ?它在开始。 pos() 返回 0,还有 156 个字节要读取。

【问题讨论】:

    标签: qt stream


    【解决方案1】:

    因为你在做

    QDataStream pS(&file);
    

    应该是

    QDataStream pS(&file1);
    

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2012-10-13
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多