我正在尝试使用ifstream的read()函数加载一个RTCW BSP文件,其中不同的块被定义为结构,但是当我查看调试器中的变量时,我得到了错误的值。
前两个结构的定义如下:
struct DirEntry
{
int offset;
int length;
};
struct Header
{
char magic[4];
int version;
DirEntry direntries[17];
};
我用来阅读的代码是:
bool XWorldMap::Load(string filename, ID3D10Device* pd3d)
{
ifstream mapfile;
mapfile.open(filename.c_str(), ios::binary);
if (!mapfile.is_open())
return false;
else
{
// read in header
Header head;
mapfile.read((char*)(&head), sizeof(head));
}
return true;
}
我也试过这个:
Header head;
mapfile.read((char*)(&head.magic), sizeof(head.magic));
mapfile.read((char*)(&head.version), sizeof(head.version));
仍然没有得到正确的价值观。
我很确定它与文件中的struct padding有关,但我不知道如何正确设置它......
感谢。
答案 0 :(得分:0)
通常,如果你想以这种方式读取struct,你需要确保你的结构中没有填充。
尝试这样的方法以确保编译器不会在char变量周围插入额外的填充字节:
#pragma pack(1)
struct DirEntry
{
int offset;
int length;
};
struct Header
{
char magic[4];
int version;
DirEntry direntries[17];
};
#pragma pack()
但是,由于你有char [4],我不知道pragma pack(1)会改变你的struct的二进制布局。您能否提供有关您阅读数据的方式不符合预期的详细信息?