尝试编写包含向量成员的数据结构时,我注意到当从缓冲区读回数据时,向量成员不准确。
首先,我使用简单的值手动编写结构:(假设在这种情况下POD成员是准确的。)
void ObjFileImport::WriteGeometryFile(LPWSTR In_File){
BaseGeometry WriteTest;
WriteTest.VertexData = {
XMFLOAT3(9.5, 6.7f, 9.3f),
XMFLOAT3(3.5f, 6.7f, 9.3f),
XMFLOAT3(3.5f, 6.7f, 9.3f) };
WriteTest.ColorData = { XMFLOAT4(3.5f, 6.7f, 9.3f, 5.6f) };
WriteTest.Update();
ofstream File;
File.open(In_File, ofstream::binary | ofstream::out);
if (File.is_open()){
File.write((const char*)&WriteTest.Version, sizeof(float));
File.write((const char*)&WriteTest.sz_Array[0], sizeof(size_t)*WriteTest.sz_BG_Mbr);
File.write((const char*)WriteTest.ColorData.data(), sizeof(XMFLOAT4)*WriteTest.sz_ColorData);
File.write((const char*)WriteTest.ImageData.data(), sizeof(XMFLOAT4)*WriteTest.sz_ImageData);
File.write((const char*)WriteTest.VertexData.data(), sizeof(XMFLOAT3)*WriteTest.sz_VertexData);
File.write((const char*)WriteTest.NormalData.data(), sizeof(XMFLOAT3)*WriteTest.sz_NormalData);
File.write((const char*)WriteTest.TextureCoordData.data(), sizeof(XMFLOAT2)*WriteTest.sz_TextureCoordData);
File.write((const char*)&WriteTest.IndexVertexData, sizeof(UINT)*WriteTest.sz_IndexVertexData);
File.write((const char*)&WriteTest.IndexTextureCoordData, sizeof(UINT)*WriteTest.sz_IndexTextureCoordData);
File.write((const char*)&WriteTest.IndexNormalData, sizeof(UINT)*WriteTest.sz_IndexNormalData);
}
File.close();
}
这样可以正常工作......根据阅读时显示的常规类型,如下所示:
void ObjFileImport::ReadGeometryFile(LPWSTR In_File){
int Sz_Base = sizeof(BaseGeometry);
BaseGeometry Temp;
ifstream File;
File.open(In_File, ifstream::binary | ifstream::in | ifstream::ate);
if (File.is_open()){
int FileSize = File.tellg();
File.seekg(0, File.beg);
//Read version number.
File.read((char*)&Temp.Version, sizeof(float));
File.read((char*)&Temp.sz_Array, sizeof(size_t) *Temp.sz_BG_Mbr); //Test for heap tranfer
File.read((char*)&Temp.ColorData, sizeof(XMFLOAT4) *Temp.sz_ColorData);
File.read((char*)&Temp.ImageData, sizeof(XMFLOAT4) *Temp.sz_ImageData);
File.read((char*)&Temp.VertexData, sizeof(XMFLOAT3) *Temp.sz_VertexData);
File.read((char*)&Temp.NormalData, sizeof(XMFLOAT3) *Temp.sz_NormalData);
File.read((char*)&Temp.TextureCoordData, sizeof(XMFLOAT2) *Temp.sz_TextureCoordData);
File.read((char*)&Temp.IndexVertexData, sizeof(UINT) *Temp.sz_IndexVertexData);
File.read((char*)&Temp.IndexTextureCoordData, sizeof(UINT)*Temp.sz_IndexTextureCoordData);
File.read((char*)&Temp.IndexNormalData, sizeof(UINT) *Temp.sz_IndexNormalData);
File.close();
}
}
不幸的是,从数据缓冲区读取时,矢量值(和大小)没有显示出来。
我知道向量本质上指向存储在堆上的数据,并试图获取该数据WriteTest.data()
的内部指针以读入二进制文件。在读出时,数据似乎没有直观的结构。
答案 0 :(得分:1)
C ++ STL不提供将STL对象存储到磁盘的本机接口。
您可以查看this thread寻求帮助。
答案 1 :(得分:0)
对于此实现,(正如Sam Varshavchik所述,评论)vector
对象被覆盖,[同样],vector
内部指针指向的相关数据,当被引用时,由于没有为被强制插入的数据正确调整大小,因此返回了一个断言错误。
void ObjFileImport::ReadGeometryFile(LPWSTR In_File){
int Sz_Base = sizeof(BaseGeometry);
BaseGeometry Temp;
ifstream File;
File.open(In_File, ifstream::binary | ifstream::in | ifstream::ate);
if (File.is_open()){
int FileSize = File.tellg();
File.seekg(0, File.beg);
//Read version number.
File.read((char*)&Temp.Version, sizeof(float));
//Brace for horrible things later. Read size definition array.
File.read((char*)&Temp.sz_Array, sizeof(size_t)*Temp.sz_BG_Mbr);
//If local pointer null, make not null, else, allocate space.
if (Temp.sz_ColorData == 0)Temp.ColorData.resize(1);
else Temp.ColorData.resize(Temp.sz_ColorData);
if (Temp.sz_ImageData == 0)Temp.ImageData.resize(1);
else Temp.ImageData.resize(Temp.sz_ImageData);
if (Temp.sz_VertexData == 0)Temp.VertexData.resize(1);
else Temp.VertexData.resize(Temp.sz_VertexData);
if (Temp.sz_TextureCoordData == 0)Temp.TextureCoordData.resize(1);
else Temp.TextureCoordData.resize(Temp.sz_TextureCoordData);
if (Temp.sz_NormalData == 0)Temp.NormalData.resize(1);
else Temp.NormalData.resize(Temp.sz_NormalData);
if (Temp.sz_IndexVertexData == 0)Temp.IndexVertexData.resize(1);
else Temp.IndexVertexData.resize(Temp.sz_IndexVertexData);
if (Temp.sz_IndexTextureCoordData == 0)Temp.IndexTextureCoordData.resize(1);
else Temp.IndexTextureCoordData.resize(Temp.sz_IndexTextureCoordData);
if (Temp.sz_IndexNormalData == 0)Temp.IndexNormalData.resize(1);
else Temp.IndexNormalData.resize(Temp.sz_IndexNormalData);
//Read contents of buffer in.
File.read((char*)Temp.ColorData.data(), sizeof(XMFLOAT4) *Temp.sz_ColorData); // *Temp.sz_ColorData);
File.read((char*)Temp.ImageData.data(), sizeof(XMFLOAT4) *Temp.sz_ImageData);
File.read((char*)Temp.VertexData.data(), sizeof(XMFLOAT3) *Temp.sz_VertexData);
File.read((char*)Temp.NormalData.data(), sizeof(XMFLOAT3) *Temp.sz_NormalData);
File.read((char*)Temp.TextureCoordData.data(), sizeof(XMFLOAT2) *Temp.sz_TextureCoordData);
File.read((char*)Temp.IndexVertexData.data(), sizeof(UINT) *Temp.sz_IndexVertexData);
File.read((char*)Temp.IndexTextureCoordData.data(), sizeof(UINT)*Temp.sz_IndexTextureCoordData);
File.read((char*)Temp.IndexNormalData.data(), sizeof(UINT) *Temp.sz_IndexNormalData);
File.close();
}
}
"固定"代码,虽然数据是否仍然存在"跨机器类型可能有问题。