如何在 c++ 中将二进制文件加载/读取到"vector<vector< bitset<32> >"中?
How to load/read binary file into an "vector<vector< bitset<32> >" in c++?
我在加载/读取
vector<vector< bitset<32> >
(在我的代码中称为/类型定义为人口)
它使用以下代码存储:
void genetic_algorithm::save_generation(population pop_to_save, string filename){
std::ofstream file(filename, std::ofstream::binary);
unsigned long n;
for(size_t i = 0; i < pop_to_save.size(); i++ )
{
if ( pop_to_save[i].size() > 0 )
{
n = pop_to_save[i][0].to_ulong();
const char* buffer = reinterpret_cast<const char*>(&n);
file.write(buffer, pop_to_save[i].size());
}
}
}
因此,我需要的是一个可以加载的函数,即:
population genetic_algorithm::load_generation(string filename){
// TODO
}
此致敬意
马蒂亚斯。
编辑
我已经自己解决了这个问题(在评论的帮助下) 以下是可能面临相同问题的任何内容的最终代码:
void genetic_algorithm::save_generation(population pop_to_save, string filename){
std::ofstream file(filename, std::ofstream::binary);
unsigned long n;
for(size_t i = 0; i < pop_to_save.size(); i++ ) {
for (size_t j = 0; j < pop_to_save[i].size(); j++) {
n = pop_to_save[i][j].to_ulong();
file.write(reinterpret_cast<const char*>(&n), sizeof(n));
}
}
std::cout << "Saved population to: " << filename << 'n';
}
population genetic_algorithm::load_generation(string filename){
std::ifstream file(filename, std::ofstream::binary);
population loaded_pop (20, std::vector<bitset<32>> (394,0));
unsigned long n;
for(size_t i = 0; i < 20; i++ ) {
for (size_t j = 0; j < 394; j++) {
file.read( reinterpret_cast<char*>(&n), sizeof(n) );
loaded_pop[i][j] = n;
}
}
std::cout << "Loaded population from: " << filename << 'n';
return loaded_pop;
}
我genetic_algorithm::save_generation()
检查了你的方法,我发现了:
-
bitset<32>
以打包形式存储 32 位(可能是具有 32 位或类似内容的unsigned int
)。 -
vector<bitset<32> >
存储此类位集的动态数组。 -
vector<vector<bitset<32> > >
存储此类位集动态数组的动态数组。
目前为止,一切都好。在方法genetic_algorithm::save_generation()
中,循环遍历外部向量的所有元素以转储每个内部向量的内容(如果不是空的)。
file.write(buffer, pop_to_save[i].size());
可能不是您想要的。std::ostream::write()
的第二个参数是字符数。传递 resp. 内部向量的size()
,该向量返回元素的数量(但不返回以字节为单位的大小)。但是元素大小(bitset<32>
)可能大于字符。更好的方法(尽管不是最好的)是使用代替file.write(buffer, 4 * pop_to_save[i].size());
。(sizeof (char)
: 1,sizeof bitset<32>
: 希望是 4 但我会检查这个。
因此,更安全的是使用file.write(buffer, pop_to_save[i].size() * sizeof pop_to_save[i][0]);
.这更好,但仍然不完美。如果要在多个平台上使用应用程序,这可能会失败,因为文件格式现在变得依赖于平台。(这取决于sizeof pop_to_save[i][0]
。
因此,最好的方法是也为内部向量创建一个嵌套循环,并使用一种独立于平台的大小单独存储它们的元素(例如std::uint32_t
)。
但是,我真正关心的是设计问题:
如果存储动态数组的动态数组(其中每个内部数组可能具有任意大小),则还必须存储这些内部数组的元素数。这就是我在你的方法中错过的genetic_algorithm::save_generation()
.
可能是,您的加载问题是由以下事实引起的:您必须保留或调整内部向量的大小才能加载位,但您不知道使用哪种大小。我的回答是:你不可能知道。此信息丢失(并且必须以某种方式提供,例如由文件本身提供)。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- std::vector的包装器,使数组的结构看起来像结构的数组
- 呼叫运营商<<临时
- 为什么(-1)%vector::size()总是返回0
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在C++中将类(带有Vector成员)保存为二进制文件
- 编译器如何区分std::vector的构造函数
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- std::vector::reserve(未知m),我知道m<<;N(通常)并且知道N
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- C++重载<<具有typedef'd std::vector
- std::映射<>或std::vector<>在处理大型标志集时