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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Чтение бинарного файла  (Прочитано 32274 раз)
Larry
Гость
« Ответ #45 : Апрель 23, 2016, 09:49 »

а вот сам файл
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #46 : Апрель 23, 2016, 09:51 »

Код
C++ (Qt)
QDataStream stream(&file);
stream.setByteOrder(QDataStream::LittleEndian);
 
int count;
stream >> count;
char buf[11];
stream.readRawData( buf, sizeof(buf) );
char buf2[201];
stream.readRawData( buf2, sizeof(buf2) );
 
QTextCodec* codec = QTextCodec::codecForName("windows-1251");
file.close();
 
QMessageBox::about(this, "title", codec->toUnicode( QByteArray( buf + 1, buf[ 0 ] ) ) + ", " + codec->toUnicode( QByteArray( buf2 + 1, buf2[ 0 ] ) ) );
 
Записан
Larry
Гость
« Ответ #47 : Апрель 23, 2016, 10:06 »

Спасибо большое. Буду дальше разбираться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Апрель 23, 2016, 10:39 »

В "С" нет длины строки, еe конец определяется нулем на конце. Чтобы избавиться от мусора Вам надо обеспечить этот ноль
Код
C++ (Qt)
char buf[12];
stream.readRawData(buf, 11);
Q_ASSERT(buf[0] < 11);
buf[buf[0]] = 0;
 
char buf2[202];
stream.readRawData(buf2, 201);
Q_ASSERT(buf2[0] < 201);
buf2[buf2[0]] = 0;
 
Обратите внимание что размер массивов теперь + 2 байта (один на длину, другой на завершающий ноль).

« Последнее редактирование: Апрель 23, 2016, 10:45 от Igors » Записан
Larry
Гость
« Ответ #49 : Апрель 23, 2016, 11:07 »

Да спасибо, учту. Прочел два поля primarySensor,kindAnalysisSensor:byte; в quint8 и получил 2 единицы, а в countPointData:integer; читаю в int и получаю 0, хотя там должно быть 11.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #50 : Апрель 23, 2016, 11:09 »

Да спасибо, учту. Прочел два поля primarySensor,kindAnalysisSensor:byte; в quint8 и получил 2 единицы, а в countPointData:integer; читаю в int и получаю 0, хотя там должно быть 11.
Я же выше вам писал, про то что поля в файле переставлены. Вначале читайте два double, а потом уже будет int и массивы double.
Записан
Larry
Гость
« Ответ #51 : Апрель 23, 2016, 11:28 »

Там должно быть 2 по одному байту вроде бы (судя по структуре) и по названию переменных. Попробовал прочесть два раза double и потом уже количество точек в int:

1.26975e-321 ,  8.09872e-320
737288

придется позже заниматься, т.к. доця на улицу хочет:)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #52 : Апрель 23, 2016, 11:29 »

Там должно быть 2 по одному байту вроде бы (судя по структуре) и по названию переменных. Попробовал прочесть два раза double и потом уже количество точек в int:

1.26975e-321 ,  8.09872e-320
737288

придется позже заниматься, т.к. доця на улицу хочет:)
Там идет два по байту, потом два double, потом int, а потом 4 массива double.
Записан
Larry
Гость
« Ответ #53 : Апрель 23, 2016, 11:32 »

спасибо, потом попробую и отпишусь.
Записан
Larry
Гость
« Ответ #54 : Апрель 23, 2016, 14:05 »

Большое-большое спасибо:), все теперь читается - то, что нужно.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #55 : Апрель 25, 2016, 14:49 »

Old, я сторонние массивы тоже через readRawData и sizeof читаю. Это оптимальный вариант? Более красивых нет?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #56 : Апрель 25, 2016, 14:54 »

Old, я сторонние массивы тоже через readRawData и sizeof читаю. Это оптимальный вариант? Более красивых нет?
Красивей только создание класса для этого массива и переопределение операторов << и >>. Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #57 : Апрель 25, 2016, 16:02 »

Допустим я использую QVector<int> для хранения этих данных. Подозреваю, что наследоваться от QVector с дальнейшим переопределением операторов будет не самой лучшей идеей, ведь так?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #58 : Апрель 25, 2016, 16:06 »

Допустим я использую QVector<int> для хранения этих данных. Подозреваю, что наследоваться от QVector с дальнейшим переопределением операторов будет не самой лучшей идеей, ведь так?
А стоит пере усложнять? Улыбающийся
Возможно, будет достаточно сделать функцию для этого?
Например:
Код
C++ (Qt)
bool readData( QVector<int> &data );
 
// или
 
QVector<int> readData( bool &result );
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #59 : Апрель 25, 2016, 16:31 »

Ну да, не стоит Улыбающийся
Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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