从二进制文件(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。
相关文章