我正在使用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多种不同的类来覆盖可能出现的所有格式。我还阅读了其他选项,包括使用位域,编译指示,甚至Boost序列化例程(我不能,因为我必须使用std)。我的问题是:这是使用类而不填充的读取简单二进制数据的最佳方法吗?您是否建议其他选择? 我想了解什么是最安全,使用最广泛的方法。
最佳答案
我使用这些宏来允许打包的结构在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定义了打包指令,但是我不知道编译器是否支持它们。
关于c++ - 使用类无需填充即可在C++中读取二进制数据的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15691605/