【问题标题】:fwrite fails with invalid argument when writing a vector array写入向量数组时,fwrite 失败,参数无效
【发布时间】:2013-01-22 00:18:58
【问题描述】:

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

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 似乎有问题。

有人有什么想法吗?

【问题讨论】:

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

标签: c++ vector fwrite


【解决方案1】:

尝试&amp;vertexArray[0] 而不是&amp;vertexArray

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

【讨论】:

    【解决方案2】:

    应该是:

    &vertexArray[0]
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2021-01-21
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2020-09-16
      • 2021-09-22
      • 2010-12-09
      • 2014-12-31
      相关资源
      最近更新 更多