класс — лучший способ читать двоичные данные в C ++, используя классы без заполнения

Я читаю простые двоичные данные без указателей, используя классы C ++ без заполнения с помощью следующего кода:

#include <fstream>
#include <iostream>

using namespace std;

class Data {
public:
int a;
int b;
short int c;
double d;
}__attribute__((packed));

int main() {
Data myData;
ifstream ifs("test.bin", ios::binary);
ifs.read((char *)&myData, sizeof(myData));
ifs.close();
}

Я использую этот метод, потому что данные могут иметь более 20 различных форматов, и я хочу написать более 20 различных классов, чтобы охватить все форматы, которые могут отображаться. Я также читал, что другие варианты включают использование битовых полей, прагматических директив и даже подпрограмм ускоренной сериализации (я не могу, потому что мне нужно использовать std). Мой вопрос: это лучший способ читать простые двоичные данные, используя классы без заполнения? Вы предлагаете любую другую альтернативу? Я хотел бы узнать, какой самый безопасный и наиболее широко используемый метод там.

2

Решение

Я использовал эти макросы для компиляции упакованных структур как на gcc, так и на VC:

#ifdef _MSC_VER
#define BEGIN_PACK __pragma( pack(push, 1) )
#define END_PACK __pragma( pack(pop) )
#else
#define BEGIN_PACK
#define END_PACK __attribute__((packed))
#endif

Итак, вы будете использовать их так:

BEGIN_PACK
struct Data {
int a;
int b;
short int c;
double d;
} END_PACK;

Но да, обычно это так. Обратите внимание, что это нестандартные расширения.

В C ++ 11 определены директивы упаковки, но я пока не знаю, поддерживаются ли они компиляторами.

1

Другие решения

Как правило, можно использовать struct вместо class, но да, одна и та же концепция применима к обоим.

2

По вопросам рекламы [email protected]