二进制文件加载导致数据丢失

时间:2016-02-21 02:37:04

标签: c++ directx directx-11

我正在尝试从已预先格式化的文件中读取数据,以便将其直接传递到顶点缓冲区。当读取超过一定大小的文件(大于1152字节,但小于92,160字节)时,它会失败。它将文件中的许多值写入分配的内存,然后再设置其余值,留下值为-431602080,这似乎是表示干净内存的{CRT值'SO Source)。它的值的数量成功写入似乎因文件大小而异。

我已经调查过我是否超出了分配限制,但似乎不是这样。我已经检查过以确保分配没有因其他原因而失败。我已经将数据读入一个先前用值填充的向量中,以便查看它是否是手动写入值-431602080,但之前的值仍然表明它只是无法写入内存。

array(1) {
  [0]=>
  array(2) {
    ["host"]=>
    string(9) "127.0.0.1"
    ["port"]=>
    int(11211)
  }
}

以下是输出示例。某些文件不会出现此问题,并且似乎与文件大小有关。发生数据丢失的位置不是恒定的,并且由于文件大小而显得不同。

enter image description here

如您所见,数据在第4个条目之前有效,部分通过该条目。 希望有人能够对正在发生的事情有所了解。

2 个答案:

答案 0 :(得分:2)

由于这是一个二进制文件,你需要指定ios :: binary(默认是fstream的文本)

答案 1 :(得分:1)

您可以在单精度float中成功表示的最大连续整数(从零开始计算)为2 ^ 24,或 16,777,216 。您的文件长度很容易超过float可以准确表示的大小。

使用longint表示整数值,并在需要时输入float。不是相反。

如果您尝试读取文件中实际存在的更多字节,由于float中的long - 到 - f.read(vertices, fileLength);转换错误,您将无法正确读取数据 - 并且得到可能的腐败。

我会将你的变量声明为:

long vertexStride = sizeof(Vertex);                    //Gets the stride per vertex
long fileLength = f.seekg(0, std::ios::end).tellg();   //Gets the byte count
float vertexCount = fileLength / vertexStride;          //Calculates the vertex count

此外,如果seekg未清除EOF标记,请清除文件流。 在搜索开始之前使用f.clear();

另外 - 再次 - 您应该捕获所有文件流功能的返回值...它们可能会失败并且您没有停下来检查原因...请参阅此answer上的代码格式< / p>