尝试将结构向量写入文件时遇到问题。
void Obj::Write(wchar_t const* filename)
{
FILE* file;
errno_t err = _wfopen_s(&file, filename, L"wb");
assert (file && !err);
assert (sizeof(VertexData_VNT) == 32);
assert (vertexArray.size() == 1654);
//unsigned int const vertexCount = vertexArray.size();
//if (fwrite(&vertexCount, sizeof(unsigned int), 1, file) != 1) {
// perror ("fwrite(&vertexCount, ...) error:");
//}
if (fwrite(&vertexArray, sizeof(VertexData_VNT), vertexArray.size(), file) != vertexArray.size()) {
perror ("fwrite(&vertexArray, ...) error:");
}
fclose(file);
}
其中vertexArray定义为:
std::vector<VertexData_VNT> vertexArray;
和VertexData_VNT是一个32字节的结构,只包含浮点数。
大部分时间fwrite因“无效参数”错误而失败,并且什么也没写。虽然有时它工作得很好......这对我来说没有意义。
如果我取消注释上面的行,而是在同一个fwrite语句中获得“访问冲突读取位置”异常。它看起来在fwrite.c第139行中存在memcpy问题。
有人有什么想法吗?
答案 0 :(得分:2)
应该是:
&vertexArray[0]
在
if (fwrite(&vertexArray[0], sizeof(VertexData_VNT), vertexArray.size(), file) != vertexArray.size()) {
perror ("fwrite(&vertexArray, ...) error:");
}
您正在获取矢量对象的地址。不是元素的地址。
由于向量的元素保证在连续的空间中,因此第一个元素的地址就像C-Array前面的地址。
答案 1 :(得分:2)
尝试使用&vertexArray[0]
代替&vertexArray
std::vector
动态分配空间。数据不位于std::vector
对象所在的位置,但是在堆上的某处,向量通常只包含几个指针。