微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决写入二进制文件时数据丢失-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)替换为一些更大的随机数,这就是发生的情况:

  • 用5100代替4994时,我遇到了完全相同的问题。 i = 4778之后,数据有所不同。
  • 用5200代替4994时,所有数据都已成功传输。

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

解决方法

使用C ++标准库的文件操作被缓冲。原因是写与程序员要求的字节数完全一样的效率很低。例如,旋转的硬盘驱动器或SSD驱动器无法写入单个字节,而只能写入4096字节的块。因此,如果要写入一个字节,则必须读取包含该字节的4096字节块,更改要写入的一个字节,然后写入整个4096字节块。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。