crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> помогите прочитать бинарный файл
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 ?

QFile m_file("file.dat");
        
if (!m_file.open(QIODevice::ReadOnly))
    return;

QDataStream stream(&m_file);
    stream.setByteOrder(QDataStream::LittleEndian);

char text[8];
double d;
qint32 length;

for (int i = 0, i < 8; i++)
stream >> text[i];

stream >> d;
stream >> length;

float* data = new float[length];

for (int i = 0, i < length; i++)
stream >> data[i];

както так. писал на скорую руку. Это через 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 ?

Если так попробовать?

QFile m_file("file.dat");
        
if (!m_file.open(QIODevice::ReadOnly))
    return;

QDataStream stream(&m_file);
stream.setByteOrder(QDataStream::LittleEndian);
stream.setFloatingPointPrecision(QDataStream::SinglePrecision);

QString str;
double d;
qint32 length;

quint8 c;
for (int i = 0; i < 8; i++)
{
    stream >> c;
    str.append(char(c));
}

stream >> d;
stream >> length;

float* data = new float[length];

for (int i = 0, i < length; i++)
    stream >> data[i];



Цитата(menand @ 31.1.2012, 19:20) *
не пашет.. цикл не нравиться первый же..

ЗЫ а как оно запоминает где он в данный момент читает?. там никакое смещение указывать не надо?

Нет там девайс в нашем случае файл, обновляет позицию, а стрим ее считывает и запоминает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(menand @ 31.1.2012, 18:28) *
1) 8 байт текста
2) флоат64
3) инт32
4) for(int i=0;i<N;i++) читать флоат32


если файл ты создаёшь сам, то сразу лучше перейди на использование XML

а данную кашу можно разобрать так:

//1) 8 байт текста
//2) флоат64
//3) инт32
#pragma pack(push,1)
struct s_header
{
  char8 text[8];
  float64 n1;
  int32 n2;
};
#pragma pack(pop)


читаем sizeof(s_header) в переменную типа s_header

s_header h;
read(&h,sizeof(h));


оттуда узнаём, видимо, длину массива -> N

затем читаем sizeof(float64) * N байтов

std::vector<float64> v(N,0);
read(&v[0],v.size());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 1.2.2012, 8:16
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 1.2.2012, 7:38) *
если файл ты создаёшь сам, то сразу лучше перейди на использование XML


Думаю в xml хранить бинарные массивы не удачное решение.
1й вопрос зачем?
2й вопрос на сколько больше это будет стоить на диске?
3й вопрос на сколько медленней будет производиться чтение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 никогда не будет собран.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 18:42