将'3d'矢量 Pod 类型写入二进制文件 C++
write '3d' vector pod type to binary file c++
我制作了以下示例代码(使用-std=c++11编译)
这是一个三维矢量10*20*30,到处都是数字8。我不知道如何把它写进磁盘再读回来。有人能告诉我如何取悦或完成r-rw例程吗?
#include <iostream>
#include <vector>
#include <fstream>
int main(int argc, char *argv[])
{
//'3d' vector filled with 8's
std::vector<std::vector<std::vector<int>>> all8s (10,std::vector<std::vector<int>>(20,std::vector <int>(30,8)));;
//print the whole
std::cout << "1st size " << all8s.size() << " n";
for ( auto& elemTop : all8s ) {
std::cout << "2nd size " << elemTop.size() << " n";
for ( auto& elemMiddle : elemTop ) {
std::cout << "3th size " << elemMiddle.size() << " n";
for ( auto& elemBottom : elemMiddle ){
std::cout << elemBottom << ",";
}
std::cout << "n";
}
}
//write binary file
std::ofstream out("all8s.bin", std::ios::out | std::ios::binary);
//how do I write this to disk
out.close();
//read it?
std::vector<std::vector<std::vector<int>>> all8sReloaded;
std::ifstream in("all8s.bin", std::ios::in | std::ios::binary);
//how to read it back?
in.close();
}
不可能在一个写语句中写入所有块。根据您的代码,一个非常简单的解决方案是:
for ( auto& elemTop : all8s )
for ( auto& elemMiddle : elemTop )
for ( auto& elemBottom : elemMiddle )
cout.write (reinterpret_cast(const char*)&elemBottom, sizeof(int));
另一方面,如果你想阅读它们,你需要知道向量的维度;它是相似的。如果没有,则必须在数据之前保存此大小。
两个嵌套循环是一种可能的方式,然后编写例如&all8s[i][j][0]
(与all8s[i][j].data()
相同)。注意,我使用向量索引作为示例,您可以使用迭代器或基于范围的for
循环,就像您已经使用的那样。
如果你已经知道尺码的话,阅读很容易。您可以将大小设置为编译时固定的大小(如示例all8s
),也可以将文件中的大小(维度)保存为数据之前的标头。无论你如何获得大小,你都需要调整向量的大小,并以基本上相同的方式读取
或者简单地使用已经内置了大部分功能的序列化库。
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作