QIODevice Получение ReadPastEnd при самом первом чтении с QDataStream - PullRequest
1 голос
/ 17 июня 2011

Ну, проблема довольно сложная. Я упрощаю это тем, что вижу в отладчике.

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;
}

Здесь Зов идет в If. и это делает setStatus (ReadPastEnd) ;. Но почему ? Его в начале. и pos () возвращает 0, и еще есть 156 байт для чтения.

1 Ответ

2 голосов
/ 17 июня 2011

Потому что вы делаете

QDataStream pS(&file);

это должно быть

QDataStream pS(&file1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...