从二进制文件(C++)读取结构时出现令人讨厌的错误

2022-06-10 00:00:00 binary struct fopen c++

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

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

我也在头文件中创建了此结构的一个实例来定义变量:

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

现在它不起作用了。结构的int变量已正确获取,但向量变量显示为?有记忆错误。我是C++的新手,这可能是一个愚蠢的问题,但我不明白这一点。我也尝试了ofstream和ifstream的C++函数,也遇到了同样的问题。

提前谢谢。


解决方案

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

就像你说的那样:

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

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

若要合法保存向量,请先保存向量的大小,然后迭代并保存每个元素,或者使用Boost Serialization。

相关文章