gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:58:25 30 4
gpt4 key购买 nike

我有一个包括4994个 vector 的数组。我想将数组保存为二进制格式的文件。由于我不习惯这样做,因此我进行了测试以查看数组是否已成功复制到文件中。因此,我首先将数组保存在文件中,然后从该文件加载数组。比较数据,我发现在特定点之后它们是不同的:

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),这就是发生的情况:
  • 用5100代替4994时,我遇到了完全相同的问题。 i = 4778之后,数据不同。
  • 用5200代替4994时,所有数据均已成功传输。

  • 这对我来说毫无意义。有任何想法吗?

    最佳答案

    使用C++标准库的文件操作被缓冲。原因是写与程序员要求的字节数完全一样的效率很低。例如,旋转的硬盘驱动器或SSD驱动器无法写入单个字节,而只能写入4096字节的块。因此,如果要写入单个字节,则必须读取包含该字节的4096字节块,更改要写入的一个字节,然后写入整个4096字节块。
    如果逐字节写入整个兆字节,则可以看到每个字节都需要读取一个4096字节的块,然后再写入这样的块。为了解决这个问题,C++标准库收集数据,并在收集到足够的数据后写入数据。当文件关闭时,其余数据将被写入。
    您调用.write写入x个字节。结果是实际写入的字节数少于x,而如果您编写了另一个 vector 或关闭了文件,其余的字节将被写入。您没有这样做,然后为同一文件打开另一个流。问题是您的x字节尚未被写入,因此无法读取它们。

    关于c++ - 写入二进制文件时数据丢失-C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64018731/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com