写入矢量数组时,Fwrite失败,参数无效

fwrite fails with invalid argument when writing a vector array

本文关键字:Fwrite 失败 参数 无效 数组      更新时间:2023-10-16

我在尝试将结构体向量写入文件时遇到问题。

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失败并返回"Invalid argument"错误,什么也不写。虽然有时效果很好……这对我来说没有意义。

如果我取消上面的注释,我会在同一个fwrite语句中得到一个"访问冲突读取位置"异常。在fwrite.c,第139行,内存似乎有问题。

有人有什么想法吗?

&vertexArray[0]代替&vertexArray

std::vector动态分配空间。数据不是位于std::vector对象所在的位置,而是在堆上的某个地方,并且向量通常只保存几个指针。

应该是:

&vertexArray[0]

if (fwrite(&vertexArray[0], sizeof(VertexData_VNT), vertexArray.size(), file) != vertexArray.size()) {
    perror ("fwrite(&vertexArray, ...) error:");
}

您正在获取向量对象的地址。不是元素的地址。

由于vector的元素保证在连续空间中,获取第一个元素的地址就像获取C-Array的前端地址一样。