gpt4 book ai didi

c++ - 从二进制文件 (C++) 读取结构的烦人错误

转载 作者:行者123 更新时间:2023-11-30 02:55:50 25 4
gpt4 key购买 nike

我有一个用于读取 .ASE 文件的类,需要将变量存储在二进制文件中,以便下次应用程序运行时可以更快地访问。我将我的信息存储在一个结构中,以使编写过程更容易。这是我使用的结构,在 header 中定义:

struct myMesh{
std::vector<Vector3> vertices;
std::vector<Vector2> uvs;
std::vector<Vector3> normals;
int verticesSize;
int uvsSize;
int normalsSize;
};

我还在 header 中创建了这个结构的一个实例来定义变量:

myMesh myInfo;

将数据存储在结构变量中后,我使用 C 函数编写了一个二进制文件:

std::string path = filename + ".bin";
const char * c = path.c_str();

FILE *pBinaryFile;
pBinaryFile = fopen(c, "wb");
if (pBinaryFile==NULL){
std::cout << "error";
}
fwrite(&myInfo.vertices, sizeof(myInfo), 1, pBinaryFile);
fclose(pBinaryFile);

为了测试二进制文件是否正确创建,我读取了文件并创建了另一个结构实例来可视化数据:

myMesh _myInfo;
FILE *theFile;
theFile = fopen(c, "rb");
if (theFile==NULL){
std::cout << "error";
}
fread(&_myInfo, sizeof(_myInfo), 1, theFile);
fclose(theFile);

这很好用。当我只尝试读取文件时出现问题,而不是使用写入过程:

/*FILE *pBinaryFile;
pBinaryFile = fopen(c, "wb");

if (pBinaryFile==NULL){
std::cout << "error";
}

fwrite(&myInfo.vertices, sizeof(myInfo), 1, pBinaryFile);
fclose(pBinaryFile);*/


myMesh _myInfo;
FILE *theFile;
theFile = fopen(c, "rb");
if (theFile==NULL){
std::cout << "error";
}
fread(&_myInfo, sizeof(_myInfo), 1, theFile);
fclose(theFile);

现在不行了。 struct 的 int 变量被正确获取,但是 vector 变量以 ??? 的形式出现有内存错误。我对 C++ 很陌生,这可能是一个愚蠢的问题,但我不明白这一点。我还尝试了 ofstream 和 ifstream 的 C++ 函数,我遇到了同样的问题。

提前致谢。

最佳答案

std::vector 将在堆上分配空间,并且只会保留 vector 对象本身的指针。

就像你说的那样:

Type* array = new Type[10];  // array's value is a memory address, NOT the array itself

如果将 vector 打印到文件中,实际上是在打印地址。这就是为什么如果您在同一次运行中执行保存和加载它不会失败的原因——地址没有改变,所以它只是从您离开的地方开始。但是如果你不填充一个 vector 并将它保存在前面,你已经保存的地址将指向空,导致非法内存访问。

要合法地保存 vector ,要么先保存 vector 的大小,然后迭代它并保存每个元素,要么使用 Boost Serialization .

关于c++ - 从二进制文件 (C++) 读取结构的烦人错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16120937/

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