写入二进制文件时数据丢失 - C++

Data get lost when written to binary file - C++

我有一个包含 4994 个向量的数组。我想将数组以二进制格式保存在文件中。由于我不习惯这样做,所以我做了一个测试,看看数组是否成功复制到文件中。所以,我首先将数组保存在一个文件中,然后从该文件加载数组。对比数据,我发现他们在特定点之后是不一样的:

vec3* points = new vec3[4994];
vec3* pointsRead = new vec3[4994];

//
//Adding data in 'points'...
//

//Write 'points' in binary file
std::ofstream suzannePointsFile("suzannePoints.data", std::ios_base::binary);
suzannePointsFile.write((char*)points, sizeof(vec3) * 4994);

//Read 'points' into 'pointsRead'
std::ifstream suzanneRead("suzannePoints.data", std::ios_base::binary);
suzanneRead.read((char*)pointsRead, sizeof(vec3) * 4994);

for (int i = 0; i < 4994; i++) {
    if (points[i] != pointsRead[i]) {
        //When debugging, the if statement is true when i>=4778.
        //Meaning that the data is different from this point on.
    }
}

我认为写入或读取函数有问题。所以我尝试将他们的第二个参数 (sizeof(vec3)*4994) 替换为一些随机更大的数字,这就是发生的事情:

这对我来说毫无意义。有什么想法吗?

缓冲使用 C++ 标准库对文件的操作。原因是完全按照程序员的要求写入尽可能多的字节可能效率很低。例如,旋转硬盘驱动器或 SSD 驱动器不能写入单个字节,而只能写入 4096 字节的块。因此,如果您想写入单个字节,则必须读取包含它的 4096 字节块,更改要写入的一个字节,然后写入整个 4096 字节块。

如果你写一整兆字节,一个字节一个字节,你会看到每个字节都需要读取一个4096字节的块,然后写入这样一个块。为了解决这个问题,C++ 标准库收集数据,当收集到足够的数据时,然后 写入数据。并且当文件关闭时,将写入其余数据。

您调用了 .write 来写入 x 个字节。结果是实际写入的字节数少于 x 字节,如果您写入另一个向量或关闭文件,其余的字节将被写入。您没有这样做,然后为同一文件打开了另一个流。问题是你的x字节还没有写入,所以无法读取。