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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Считать бинарный файл средствами Qt  (Прочитано 10953 раз)
melifaro
Гость
« : Июль 08, 2009, 22:59 »

Есть бинарный файл(порятка 20Mb), его нужно считывать блоками по 42 байта и заполнять этим QLinkedList<Rez_10_A2> который находится в классе.
struct Rez_10_A2 //собственно 42 байта
{
    тут пара десятков полей
}
Вопрос - как?

Как считать из потока QDataStream определенное количество байт?
Ведь
   Rez_10_A2 buf;
   QDataStream stream(file);
   stream >> buf;
Работает только со стандартными типами, а перегружать >> для Rez_10_A2 очень накладно, есть ли простой способ вроде fread из stdio.h?
Записан
f-r-o-s-t
Гость
« Ответ #1 : Июль 08, 2009, 23:09 »

А чем будет накладно перегрузить >> ?
а читать из файла по байтам вот так:
int QDataStream::readRawData ( char * s, int len )
Записан
melifaro
Гость
« Ответ #2 : Июль 08, 2009, 23:43 »

Накладно тем, что там куча полей и не факт что они стандартные.
Не могу никак понять как использовать QDataStream & QDataStream::readRawBytes (char * s, uint len), можешь написать пример? Вроде в моем случае что-то такое:
while(!stream.atEnd)
{
    s = new char[42];
    stream.readRawBytes(s,42);
    rez = s;//  Rez_10_A2 rez;
    list->append(rez);
   
}
При этом мы будем двигаться по файлу?
И что-то я сомневаюсь что rez = s; покатит) Пока не знаю каким это образом сделать, подскажите пожалуйста.
Записан
f-r-o-s-t
Гость
« Ответ #3 : Июль 08, 2009, 23:51 »

Ну   rez = s; точно не покатит.
имхо Проще будет переопределить  QDataStream &operator>>(QDataStream &, QXxx &);
и если есть нестандартные поля то в них тоже переопределить его.
сделать эту функцию friend для класса в котором переопределяешь и все.
Иначе разбирать строчку и записывать в поля.
Вот пример писал недавно:

Код
C++ (Qt)
class ipAddress
{
public:
   ipAddress();
    ...
private:
   quint8 myIp[4];
protected:
   friend QDataStream& operator>>(QDataStream &stream, ipAddress &address);
   friend QDataStream& operator<<(QDataStream &stream, const ipAddress &address);
};
 
QDataStream& operator<<(QDataStream &stream, const ipAddress &address)
{
   for (int i = 0 ; i < 4 ; i++ ) stream << address.myIp[i];
   return stream;
}
QDataStream& operator>>(QDataStream &stream, ipAddress &address)
{
   for (int i = 0 ; i < 4 ; i++ ) stream >> address.myIp[i];
   return stream;
}
 

и можно писать свой класс прямо в поток.
П.С. не претендую на то что мое решение лучшие .
Записан
crackedmind
Гость
« Ответ #4 : Июль 09, 2009, 01:37 »

Ну взять наплевать на все. Сделать для структуры выравнивание в 1 байт.
Затем

Код
C++ (Qt)
while(!stream.atEnd)
{
   stream.readRawBytes((char*)rez,42);
   list->append(rez);
}
 
Записан
ритт
Гость
« Ответ #5 : Июль 09, 2009, 02:19 »

+1
самый ненакладный вариант
Записан
melifaro
Гость
« Ответ #6 : Июль 09, 2009, 07:27 »

то что нужно, спасибо
Записан
f-r-o-s-t
Гость
« Ответ #7 : Июль 09, 2009, 08:58 »

Ну вот так вообще прекрасно =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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