2017-04-03 27 views
0

我有装载问题/读取如何在C++中将二进制文件加载到“vector <vector < bitset<32>>”中?

vector<vector< bitset<32> > 

(被称为/在我的代码Typedef的人口)

它使用下面的代码保存:

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 
} 

最好的问候,

Mathias。

编辑

我已经解决了我自己的问题(从评论有点帮助) 这里为任何最终的代码,可能会面临同样的问题:

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; 
} 

回答

0

我检查你的方法genetic_algorithm::save_generation(),这是我发现:

  • bitset<32>存储32位打包形式(可能是一个unsigned int与32位或类似的东西)。

  • vector<bitset<32> >存储这样的位组的动态数组。

  • vector<vector<bitset<32> > >存储这种动态数组的位组。

到目前为止,这么好。在您的方法genetic_algorithm::save_generation()中,循环遍历外部向量的所有元素以转储每个内部向量的内容(如果不为空)。

file.write(buffer, pop_to_save[i].size());可能不是你想要的。第二个arg。 std::ostream::write()是字符数。你通过size()或resp。内部向量,返回元素的数量(但不是以字节为单位的大小)。但元素大小(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()

可能是,您的加载问题是由于您必须预留或调整要加载的位的内部向量的事实而引起的,但您不知道具有哪种大小。我的回答:你无法知道。此信息缺失(并且必须以某种方式提供,例如由文件本身提供)。

相关问题