помогите прочитать бинарный файл |
Здравствуйте, гость ( Вход | Регистрация )
помогите прочитать бинарный файл |
menand |
31.1.2012, 15:28
Сообщение
#1
|
Студент Группа: Участник Сообщений: 21 Регистрация: 31.1.2012 Пользователь №: 3171 Спасибо сказали: 0 раз(а) Репутация: 0 |
Есть файл.
в начале 8 байт - текста (ascii), затем float64 число, затем int32 число, затем массив float32 длинна которого - в int32 числе (которое только что считали) (ну и т.д., дальше уже по аналогии разберусь). Собственно вопрос - как отрыть такой файл и читать с него данные? Тоесть может ли кто-нибудь привести пример чтения: 1) 8 байт текста 2) флоат64 3) инт32 4) for(int i=0;i<N;i++) читать флоат32 ЗЫ программа должна быть кросс-платформленной.. тоесть длинну типов надо както явно задавать.. |
|
|
sidsukana |
31.1.2012, 15:42
Сообщение
#2
|
Участник Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: 2 |
float64 == double ?
както так. писал на скорую руку. Это через QDataStream можно конечно через явное преобразование через сырые данные. еще забыл. stream.setFloatingPointPrecision(QDataStream::SinglePrecision); иначе float будет за 8 байт считаться. Сообщение отредактировал sidsukana - 31.1.2012, 16:15 |
|
|
menand |
31.1.2012, 16:20
Сообщение
#3
|
Студент Группа: Участник Сообщений: 21 Регистрация: 31.1.2012 Пользователь №: 3171 Спасибо сказали: 0 раз(а) Репутация: 0 |
не пашет.. цикл не нравиться первый же..
ЗЫ а как оно запоминает где он в данный момент читает?. там никакое смещение указывать не надо? |
|
|
sidsukana |
31.1.2012, 16:31
Сообщение
#4
|
Участник Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: 2 |
А в 8 байтах текста, он как текст? Т.е заканчивается на \0 ?
Если так попробовать?
не пашет.. цикл не нравиться первый же.. ЗЫ а как оно запоминает где он в данный момент читает?. там никакое смещение указывать не надо? Нет там девайс в нашем случае файл, обновляет позицию, а стрим ее считывает и запоминает. |
|
|
menand |
31.1.2012, 17:02
Сообщение
#5
|
Студент Группа: Участник Сообщений: 21 Регистрация: 31.1.2012 Пользователь №: 3171 Спасибо сказали: 0 раз(а) Репутация: 0 |
не.. просто 8 байт - 8 букв, потом сразу флоат, потом сразу инт, потом сразу массив флотов и т.д.
во! последний варинт замечательно читает строки и целые типы! проблема - что есть qint32 но нет qfloat32 (тобишь кросс-платформленного 4х байтового числа с плавающей запятой) итак... for(int i=0;i<4;i++){ stream >> c; qDebug()<<c; } выдаёт 0 128 149 67... если сразу во флот читать - то просто 0... а должно быть 299.0 |
|
|
sidsukana |
31.1.2012, 17:14
Сообщение
#6
|
Участник Группа: Участник Сообщений: 158 Регистрация: 23.12.2010 Из: Челябинск Пользователь №: 2296 Спасибо сказали: 10 раз(а) Репутация: 2 |
float это и есть 4 байтовое число с плавающей точкой - ака float32
double это 8 байтовое число с плавающей точкой - ака float64 stream.setFloatingPointPrecision(QDataStream::SinglePrecision); задает стримеру читать и записывать float как 4 байтовое, и double как 8 байтовое. и c это quint8 а не float. В первом цикле я доставал посимвольно через unsigned char (uint8). Во втором цикле float должен доставаться. |
|
|
Алексей1153 |
1.2.2012, 6:38
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
1) 8 байт текста 2) флоат64 3) инт32 4) for(int i=0;i<N;i++) читать флоат32 если файл ты создаёшь сам, то сразу лучше перейди на использование XML а данную кашу можно разобрать так:
читаем sizeof(s_header) в переменную типа s_header
оттуда узнаём, видимо, длину массива -> N затем читаем sizeof(float64) * N байтов
|
|
|
wiz29 |
1.2.2012, 8:16
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
|
|
|
menand |
1.2.2012, 10:51
Сообщение
#9
|
Студент Группа: Участник Сообщений: 21 Регистрация: 31.1.2012 Пользователь №: 3171 Спасибо сказали: 0 раз(а) Репутация: 0 |
не.. не всё так просто..
собственно пишу конвертер текплот бинарного в аскии формат. http://download.tecplot.com/360/2010r1/dataformat.pdf спецификация. шапка уже нормально читается.. и вообщем вроде как прогресс =) |
|
|
Iron Bug |
1.2.2012, 18:22
Сообщение
#10
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
по моему, Алексей1153, разумное решение предложил. зачем какой-то выпендрёж, если это самые стандартные, базовые функции С? они поддерживаются во всех системах. даже в тех, для которых Qt никогда не будет собран.
|
|
|
Текстовая версия | Сейчас: 26.11.2024, 2:13 |