3

次のコードをパディングせずに 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 を使用する必要があるため、できません)。私の質問は:これは、パディングなしでクラスを使用して単純なバイナリ データを読み取るための最良の方法ですか? 他の代替案はありますか?最も安全で広く使われている方法を知りたいです。

4

2 に答える 2

2

通常、 のstruct代わりに を使用しclassますが、同じ概念が両方に適用されます。

于 2013-03-28T20:36:12.797 に答える
1

これらのマクロを使用して、パックされた構造体を 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 ではパッキング ディレクティブが定義されていますが、コンパイラでサポートされているかどうかはわかりません。

于 2013-03-28T20:42:08.197 に答える