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

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

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

Добрый день.
Есть бинарный файл в который записаны данные из структуры на delphi.
Вот структура:
Код:
TData=record
      id:string[10];
      comment:string[200];
      primarySensor,kindAnalysisSensor:byte;
      countPointData:integer;
      v,u,a,b:array of real;
      percentTopLevel,percentBottomLevel:real;
end;

Как мне прочитать эти данные?
« Последнее редактирование: Апрель 23, 2016, 14:05 от Larry » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Вот они
Цитировать
ребята на QML сто двадцать плюс
Улыбающийся Все-таки лучше перенести это в самый важный (первый) раздел форума.

А серьезно - начните с дельфей и установите там правила записи которые здесь будет соблюдать чтение. Без этого не обойтись, напр если там ребята пишут через sizeof, то Ваше чтение развалится при смене установок дельфийского компилятора. Также как пишутся массивы переменной длины и кто такой real (4, 6 или 8 байт) там надо разбираться. Также хорошим тоном считается запись маркера, числа байт, и обычно еще версии.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Апрель 22, 2016, 14:20 »

Larry, читать бинарные файлы можно 2 способами. Либо через QFile напрямую, либо через QDataStream.
Записан
Larry
Гость
« Ответ #3 : Апрель 22, 2016, 15:14 »

Спасибо, пытался через QDataStream::readRawData и считал в char id[10] первые 10 символов, но потом вывел массив char через qDebug(), а там ахинея...Вывел в цикле id по символу, то увидел id + мусор, а в qstring так и не получилось.
Записан
Bepec
Гость
« Ответ #4 : Апрель 22, 2016, 15:20 »

Вам нужно
1) установить правила записи в бинарный файл, чтобы запись была независима от настроек компилятора. (если проще - самому написать ф-цию которая побайтно будет записывать данные)
2) сделав 1 пункт, вы получите бинарный файл с знакомой структурой данных.
3) зная эту структуру вы сможете на любом языке прочитать эти данные.

Ну и да, КО отвечает - чтобы прочитать данные, нужно взять QFile, считать все данные в QByteArray и потом уже разбирать и запихивать в Qt-шные типы.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Апрель 22, 2016, 15:21 »

string в Паскале и массив char используют разный подход для хранения данных. В Паскале нулевой элемент хранит количество символов в строке.
Записан
Larry
Гость
« Ответ #6 : Апрель 22, 2016, 15:46 »

Спасибо, но к исходникам программы нет доступа и никто там для меня ничего не изменит Смеющийся, значит пойду другой дорогой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 22, 2016, 16:21 »

Спасибо, пытался через QDataStream::readRawData и считал в char id[10] первые 10 символов, но потом вывел массив char через qDebug(), а там ахинея...Вывел в цикле id по символу, то увидел id + мусор, а в qstring так и не получилось.
Покажите пример двоичных данных (можно файл, можно скриншот hex-viewera), а то по пустому месим.

Спасибо, но к исходникам программы нет доступа и никто там для меня ничего не изменит Смеющийся,
Тогда надо иметь ввиду что Ваше приложение легко может оказаться несовместимым со след версией пишущего

..значит пойду другой дорогой.
Цитировать
- Аааа.. ведь я не сказал ему адреса!!!
- А здесь одна дорога
(классика советского кино)
Записан
Larry
Гость
« Ответ #8 : Апрель 22, 2016, 16:36 »

Сделал скрин.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Апрель 22, 2016, 16:49 »

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

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Апрель 22, 2016, 16:50 »

И данные, которые ожидается от него получить. Хотя бы первый элемент.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Апрель 22, 2016, 16:53 »

Первые 4 байта это скорее всего 32 битное число - наверное кол-во таких структур в файле.
Дальше идут два текстовых поля, их формат первый байт кол-во символов, дальше 10 и 200 байт для сохранения строки соответственно. Булевые значения скорее всего храняться в одном байте каждый. real это 8 битное число с плавающей точкой (double). Массив реалов скорее всего хранится как кол-во элементов (32-бита - не уверен лень считать на экране байты), а дальше сами элементы. Структуры идут последовательно одна за другой. Читается это все просто с помощью QDataStream.
« Последнее редактирование: Апрель 22, 2016, 16:55 от Old » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Апрель 22, 2016, 17:00 »

Old, а можно пример?
У меня есть подобная задача и я прям чувствую, что криво считываю данные. Больше всего смущает, что QDataStream использует version. И не совсем понятно, как читать массивы, циклом?
Записан
Larry
Гость
« Ответ #13 : Апрель 22, 2016, 17:02 »

Сам файл предоставить не могу...низя:)
Там хранятся данные из массива структур, которую я описал в первом посте...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Апрель 22, 2016, 17:05 »

Сам файл предоставить не могу...низя:)
Ну вы уже предоставили его часть Веселый Можно обрезать на 02f0 и поделиться Улыбающийся
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


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