Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bolonat от Сентябрь 26, 2017, 12:19



Название: QDataStream не читаются бинарные данные
Отправлено: Bolonat от Сентябрь 26, 2017, 12:19
Всем привет!
Пытаюсь прочесть двоичный файл. Файл начинается со следующей последовательности байт: 68 D9 27 42 00 00 00 00 00 C3 47 42 EA 60
Пытаюсь прочесть два значения типа float:
Код:
    QFile file("E:/1.bin");
    if(file.open(QIODevice::ReadOnly))
    {
        QDataStream stream(&file);
        stream.setByteOrder(QDataStream::LittleEndian);
        stream.setVersion (QDataStream::Qt_5_9);

        float a;
        float b;
        stream >> a;
        stream >> b;
        if(stream.status() != QDataStream::Ok)
        {
            qDebug() << "Ошибка чтения файла";
        }
        else
        {
            qDebug() << a;
            qDebug() << b;
        }
        file.close();
    }
Должно быть a=41.9623, b=0, получаю a=0, b= 7.49724e-13. Скажите, что я делаю не так?


Название: Re: QDataStream не читаются бинарные данные
Отправлено: Bolonat от Сентябрь 26, 2017, 13:05
Разобралась. Надо вручную устанавливать точность. Если версия превосходит Qt 4.6, то точность по умолчанию - 64 бит. Т.е. Qt попытается прочитать float 32 как float 64.
Надо писать:
Код:
stream.setFloatingPointPrecision(QDataStream::SinglePrecision);


ЗЫ. Если честно, меня Qt порой обескураживает... Зачем для типа данных, который имеет 32 бит по умолчанию считывать 64 бит? Видимо, я чего-то не понимаю...


Название: Re: QDataStream не читаются бинарные данные
Отправлено: __Heaven__ от Сентябрь 26, 2017, 16:11
Возможно, потому что стандарт гарантирует sizeof(float) <= sizeof(double), и сам размер типов не стандартизован ...


Название: Re: QDataStream не читаются бинарные данные
Отправлено: __Heaven__ от Сентябрь 26, 2017, 16:27
Хотя, скорее всего это так сделано для обобщённого программирования
Код
C++ (Qt)
template <typename Real>
std::vector<Real> readSomething() {
   // ....
   Real value;
   os >> value;
   // ....
}


Название: Re: QDataStream не читаются бинарные данные
Отправлено: Bolonat от Сентябрь 26, 2017, 16:47
Да, пишут, что для платформенной независимости.