Почему QDatastream не дает правильный вывод - PullRequest
0 голосов
/ 15 апреля 2020

В данном коде я сначала вставляю 1 число в поток и затем помещаю это значение в тест с именем Variable.

Когда я печатаю переменную, я получаю вывод как 0 вместо 1.

Это код.

    QByteArray data; 
    QDataStream stream(&data, QIODevice::ReadWrite);
    stream << 1;
    int test;
    stream >> test;
    qDebug() << test;

1 Ответ

0 голосов
/ 15 апреля 2020

Когда вы создаете QDataStream, как вы это сделали, QBuffer будет использоваться как внутренний QIODevice (см. https://doc.qt.io/qt-5/qdatastream.html#QDataStream -2 ).

QBuffer не будет работать как очередь FIFO, она просто запоминает, когда она закончила последнюю операцию, и начнет с этой точки другую операцию.

Когда вы что-то записали в свой поток, «позиция» будет перемещена после новых данных , Из-за того, что буфер был пуст в начале, курсор будет указывать на конец ваших данных, и любые попытки чтения потерпят неудачу. Если вы хотите прочитать то, что написали, вам придется переместить курсор назад.

Возможно, следующий пример прояснит эту идею:

QByteArray data;
QDataStream stream(&data, QIODevice::ReadWrite);
stream.setByteOrder(QDataStream::LittleEndian);

const std::uint32_t input = 0x01020304; // 0x01020304 = 16909060

qDebug() << "Device pos before write: " << stream.device()->pos();
stream << input;
qDebug() << "Device pos after write: " << stream.device()->pos();

qDebug() << "data content after write: " << data;

stream.device()->seek(0);
qDebug() << "Device pos after seek: " << stream.device()->pos();
std::uint32_t test;
stream >> test;
qDebug() << "Read: " << test;
qDebug() << "Device pos after read: " << stream.device()->pos();

Вывод:

Device pos before write:  0
Device pos after write:  4
data content after write:  "\x04\x03\x02\x01"
Device pos after seek:  0
Read:  16909060
Device pos after read:  4
...