2013-01-20 29 views
0

我在尝试将结构向量写入文件时遇到问题。写入向量数组时,fwrite失败,并显示无效参数

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。

任何有什么想法?

+4

使用&vetexArray [0]或vertexArray.data()。 &vertexArray是矢量的地址,而不是内部数组。 – hmjd

回答

2

尝试的&vertexArray[0]代替&vertexArray

std::vector动态分配空间。数据是而不是位于哪里std::vector对象是,但在某个地方的堆和矢量通常只有几个指针。

+0

当然应该!谢谢 – Gareth

2

它应该是:

&vertexArray[0] 

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

你所得到的矢量对象的地址。不是元素的地址。

由于向量的元素保证在连续的空间中,所以第一个元素的地址就像是C-Array的前面的地址。

+0

谢谢,是的,我应该已经发现了。 – Gareth

相关问题