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

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

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Чтение бинарного файла  (Прочитано 32210 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Спасибо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

Сообщений: 2130



Просмотр профиля
« Ответ #62 : Апрель 25, 2016, 17:33 »

продвигать операторы << и >>. И, конечно, без наследования  Улыбающийся
Покажите как?
Записан
Bepec
Гость
« Ответ #63 : Апрель 25, 2016, 18:04 »

Видимо по << на каждый тип, добавив ещё класс-контроллер который будет ещё несколько типов разбора файла иметь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #64 : Апрель 26, 2016, 08:31 »

Покажите как?
Напр чтение паскалевских строк неплохо оформить так
Код
C++ (Qt)
typedef unsigned char uchar;
 
template <uchar N>
struct TStr {
friend QDataStream & operator >> ( QDataStream & strm, TStr & dst )
{
strm.readRawData((char *) dst.mData, N);
Q_ASSERT(dst.mData[0] <= N);
dst.mData[dst.mData[0]] = 0;
return strm;
}
 
// data
uchar mData[N + 2];
};
 
Уже для 2 строк есть смысл, а будет их больше - тем более. Кстати только сейчас заметил - длина-то unsigned. В итоге чтение всей структуры должно выглядеть так
Код
C++ (Qt)
QDataStream & operator >> ( QDataStream & strm, TData & dst )
{
strm >> dst.id >> dst.comment >> ...  
return strm;
}
 
Большинство операторов >> уже есть для QDataStream. Не проверял, но вероятно и сериализация QVector "совместима" с записанным массивом, но даже если и нет - это прекрасно ляжет под template. В итоге чтение сводится к приятному
Код
C++ (Qt)
QVector<TData> vec;
strm >> vec;
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #65 : Апрель 26, 2016, 08:33 »

Напр чтение паскалевских строк неплохо оформить так

Красивей только создание класса для этого массива и переопределение операторов << и >>. Улыбающийся

И так как вы оформлять плохо. Улыбающийся
Для чего хранить буфер для максимально длины строки, если реальных данных может быть значительно меньше. Максимальный буфер можно аллоцировать только в момент чтения (а можно и тогда не аллоцировать), а хранить нужно уже исключительно реальные данные.
« Последнее редактирование: Апрель 26, 2016, 08:38 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #66 : Апрель 26, 2016, 09:15 »

Если читать в финальные данные, то примерно так
Код
C++ (Qt)
QDataStream & operator >> ( QDataStream & strm, TData & dst )
{
TStr<10> tempID;
TStr<200> tempComment;
strm >> tempID >> tempComment >> dst. primarySensor >> dst.kindAnalysisSensor >> ..
 
dst.id = tempID.GetQString();
dst.comment = tempComment.GetQString();
...
return strm;
}
Хотя тут исчезает исходная "raw" структура, что нежелательно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #67 : Апрель 26, 2016, 10:00 »

Хотя тут исчезает исходная "raw" структура, что нежелательно
Ну и Бог с ней. Что тут нежелательного? Как правило структуры в памяти несколько шире структур на диске. Добавляются новые поля для удобного хранения, кеширования...
Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


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