2017-04-21 84 views
0

我试图使用ifstream的read()函数加载定义为结构的不同块的RTCW BSP文件,但是当我查看变量时,我得到错误的值调试器。用ifstream读取二进制结构read()

第2层结构的定义是这样的:

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)); 

仍然没有得到正确的价值观。

我敢肯定,它与文件中的结构填充这样做,但我不知道如何正确设置它...

感谢。

+0

您可以尝试创建一个'Header',将其写入一个文件,将其读入一个新的'Header',然后检查它是否相同。像这样的[mcve]应该可以帮助你找到问题所在。 – NathanOliver

+0

您可以向您的问题添加您尝试加载的文件的初始部分的十六进制转储吗? – Yojimbo

回答

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],我没有事情,编译包( 1)会改变你的结构的二进制布局。您能否提供更多关于您阅读数据的方式所不具备的细节?

+0

什么不能有填充?当您读写'sizeof(Header)'字节时,'write'和'read'应当写入和读取类中的所有字节,包括填充字节。 – NathanOliver

+0

工作!非常感谢。 – Hermetix

+0

@Hermetix如果解决,不要忘记接受答案。 – Pavel