gpt4 book ai didi

c++ - 将具有 vector 成员的数据结构写入二进制文件

转载 作者:行者123 更新时间:2023-11-28 05:45:56 27 4
gpt4 key购买 nike

尝试编写包含 vector 成员的数据结构时,我注意到当从缓冲区读回数据时 vector 成员不准确。

首先我用简单的值手动写出结构:(假设 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();
}
}

不幸的是,从数据缓冲区读取时, vector 值(和大小)没有显示出来。

VS runtime values我知道 vector 本质上指向存储在堆上的数据,并试图获取该数据的内部指针 WriteTest.data() 以读入二进制文件。读出后,数据的结构似乎并不直观。

最佳答案

C++ STL 不提供将 STL 对象存储到磁盘的 native 接口(interface)。

可以查看this thread寻求帮助。

关于c++ - 将具有 vector 成员的数据结构写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36212936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com