【问题标题】:How to load/read binary file into an "vector<vector< bitset<32> >" in c++?如何在 C++ 中将二进制文件加载/读取到“vector<vector< bitset<32>>”?
【发布时间】:2017-08-28 01:20:44
【问题描述】:

我在加载/阅读时遇到问题

vector<vector< bitset<32> > 

(在我的代码中称为/typedef'ed as population)

它使用以下代码存储:

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

【问题讨论】:

    标签: c++ vector save ifstream bitset


    【解决方案1】:

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

    • bitset&lt;32&gt; 以压缩形式存储 32 位(可能是具有 32 位或类似的 unsigned int)。

    • vector&lt;bitset&lt;32&gt; &gt; 存储此类位集的动态数组。

    • vector&lt;vector&lt;bitset&lt;32&gt; &gt; &gt; 存储这种动态位集数组的动态数组。

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

    file.write(buffer, pop_to_save[i].size()); 可能不是您想要的。第二个参数。 std::ostream::write() 是字符数。你传递了相应的size()。内部向量,它返回元素的数量(但不是字节大小)。但是元素大小(bitset&lt;32&gt;)可能比字符大。更好的方法(虽然不是最好的)是使用file.write(buffer, 4 * pop_to_save[i].size());。 (sizeof (char): 1, sizeof bitset&lt;32&gt;: 希望是 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() 中错过的。

    可能是,您的加载问题是由于您必须为要加载的位保留或调整内部向量的大小,但您不知道使用哪个大小。我的回答:你不知道。缺少此信息(必须以某种方式提供,例如由文件本身提供)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多