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

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

Это код.

    QByteArray data; 
    QDataStream stream(&data, QIODevice::ReadWrite);
    stream << 1;
    int test;
    stream >> test;
    qDebug() << test;
0
suman 15 Апр 2020 в 09:19

1 ответ

Лучший ответ

Когда вы создаете 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
0
luantkow 15 Апр 2020 в 06:58