Russian Qt Forum
Апрель 19, 2024, 11:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataStream не читаются бинарные данные  (Прочитано 3030 раз)
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« : Сентябрь 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. Скажите, что я делаю не так?
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #1 : Сентябрь 26, 2017, 13:05 »

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


ЗЫ. Если честно, меня Qt порой обескураживает... Зачем для типа данных, который имеет 32 бит по умолчанию считывать 64 бит? Видимо, я чего-то не понимаю...
« Последнее редактирование: Сентябрь 26, 2017, 13:17 от Bolonat » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Сентябрь 26, 2017, 16:11 »

Возможно, потому что стандарт гарантирует sizeof(float) <= sizeof(double), и сам размер типов не стандартизован ...
« Последнее редактирование: Сентябрь 26, 2017, 17:25 от __Heaven__ » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Сентябрь 26, 2017, 16:27 »

Хотя, скорее всего это так сделано для обобщённого программирования
Код
C++ (Qt)
template <typename Real>
std::vector<Real> readSomething() {
   // ....
   Real value;
   os >> value;
   // ....
}
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #4 : Сентябрь 26, 2017, 16:47 »

Да, пишут, что для платформенной независимости.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.063 секунд. Запросов: 22.