使用ifstream read()读取二进制结构

时间:2017-04-21 15:51:51

标签: c++

我正在尝试使用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有关,但我不知道如何正确设置它......

感谢。

1 个答案:

答案 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的二进制布局。您能否提供有关您阅读数据的方式不符合预期的详细信息?