Здравствуйте, alexash, Вы писали:
A>Доброго ВСЕМ здравия человеки
A>компилятор Microsoft Visual C++ 6.0
A>В конечном итоге должна получиться некая смотрел-ка гледелка
A>? Вопрос 1 открыть файл (формат описан в приложенном файле)
A> hdf ob;
A> ifstream input("PAN.hdf", ios::in | ios::binary);
A> if(!input){cout<<"Erroe open file";};
A>и считать его в некую структуру
A>struct hdf{
A> char BEGINNING_TIME[63];
A> char ENDING_TIME[63];
A> char PLATFORM[63];
A> char SENSOR[63];
A> char STATION_ID[63];
A> char PRODUCT_ID[63];
A> char ALGORITHM_VERSION[63];
A> __int32 REV_NUMBER;// так как 32 бита
A>//и т. д.
A>};
A>но как я понял так как объекты могут отсутствовать то необходимо осуществить их поиск и заполнить
A>структуры (а может лучше класс?) как это сделать?
A>надо ли читая данные из бинарного потока преобразовывать их?
Во-первых структуру лучше объявить примерно так:
struct hdf
{
unsigned short size;
unsigned short data_type;
char BEGINNING_TIME[63];
char ENDING_TIME[63];
char PLATFORM[63];
char SENSOR[63];
char STATION_ID[63];
char PRODUCT_ID[63];
char ALGORITHM_VERSION[63];
__int32 REV_NUMBER;// так как 32 бита
И выравнивание для этой структуры установить на границу байта.
А size нужен на случай расширения формата и поддержки других структур данных. К примеру в заголовке структуры 1 типа, а в теле несклоько других. Плюс для времени есть замечательные функции из time.h. И нефиг хранить время в строковом представлении.
Здравствуйте, alexash, Вы писали:
A>Здравствуйте, Ubivetz, Вы писали:
A>a по остальным вопросам
Читать в буфер, а потом анализируя его преобразовывать данные к нужному "структурному" типу. Это как 1 из вариантов.
Или, как подвариант, завести базовую структуру только с полями
// Не забываем про выравнивание
struct TBase
{
unsigned short size;
unsigned short type;
char data[1];
};
а потом
char buf[512];
TBase b;
...
size_t bytes_read;
....
while ( bytes_read = fread( buf, 512, 1, fp ) )
{
....
b = *((TBase *)buf);
switch ( b.type )
....
и т.д.
Здравствуйте, alexash, Вы писали:
A>Доброго ВСЕМ здравия человеки
A>компилятор Microsoft Visual C++ 6.0
A>В конечном итоге должна получиться некая смотрел-ка гледелка
A>? Вопрос 1 открыть файл (формат описан в приложенном файле)
A> hdf ob;
A> ifstream input("PAN.hdf", ios::in | ios::binary);
A> if(!input){cout<<"Erroe open file";};
A>и считать его в некую структуру
A>struct hdf{
A> char BEGINNING_TIME[63];
A> char ENDING_TIME[63];
A> char PLATFORM[63];
A> char SENSOR[63];
A> char STATION_ID[63];
A> char PRODUCT_ID[63];
A> char ALGORITHM_VERSION[63];
A> __int32 REV_NUMBER;// так как 32 бита
A>//и т. д.
A>};
A>но как я понял так как объекты могут отсутствовать то необходимо осуществить их поиск и заполнить
A>структуры (а может лучше класс?) как это сделать?
A>надо ли читая данные из бинарного потока преобразовывать их?
A>-----
A>С уважением,
A>Александр Шваб
A>инженер отдела мониторинга и ДЗЗ
Нужно разработать сериализованный формат структуры. Обычно это:
Длина записи + сами данные записи.
Каждое поле сериализуется отдельно в зависимости от типа.
Для строковых переменных можно использовать тот же подход — длина плюс данные, если их длинна может быть сильно разной, а размер хранилища критичен. Или всегда использовать фиксированный.
Для целочисленных или вещественных можно записывать их представление в памяти как есть. (Это решение непортабельно — проблематично исползовать для обмена данными между разными платформами). Например,
char* p = buf; //used to go through the buffer
//...
*(int*)p = record.x; //int field of the structure
Либо переводить в строку и сохранять, как строку.
В любом случае, существуют уже готовые решения по сериализации данных, CArchive в MFC, например.
Но если есть какие-то специфические требования, то конечно все придется делать ручками
Если в структуре просто данные (никаких указателей или вложенных объектов с указателями), то можно просто писать или читать структуру как есть. Что-то вроде:
SomeStruct rec;
write(file, &rec, sizeof(SomeStruct));
Но тем не менее очень рекомендую выделить такие шаги как серилизация и десериализация в отдельные методы или функции, чтобы логика с этим связанная была локализована в одном месте. И в том случае, если необходимо изменить формат хранения (изминились требования к скорости или размеру) или набор сохраняемых данных, нужно изменить лишь одну или две функции.
Удачи.