如何使用std :: vector <bool>进行文件I / O?</bool>

时间:2013-05-14 12:03:35

标签: c++ boolean bit-manipulation

我需要实现一个存储相当大量变量的布尔数据容器。我想我可以使用char*并实现C风格的宏访问器,但我更希望将它包装在std::结构中。 std::bitset<size_t>似乎不实用,因为它具有固定的编译时大小。

这样我就可以使用std::vector<bool>来优化空间;它有一个很好的bool式存取器。

  1. 有没有办法直接将指针从它传送到fwrite()

  2. 如何将输入文件输入到这样的向量中?

  3. 最后,当需要大量文件I / O时,它是一个很好的数据结构吗?

  4. 如何随机文件访问(fseek等)?

  5. 编辑:我决定将std::vector<unsigned int>包装在一个新类中,该类具有我的要求所需的功能。

2 个答案:

答案 0 :(得分:6)

  
      
  • 有没有办法直接将指针从它输入到fwrite()?
  •   

不,但您可以使用std::fstream

执行此操作
std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
  
      
  • 如何将输入文件输入到这样的矢量中?
  •   

使用std::fstream

std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
  
      
  • 最后,当需要大量文件I / O时,它是一个很好的数据结构吗?
  •   

不,vector<bool>很少是出于任何目的的良好数据结构。见http://howardhinnant.github.io/onvectorbool.html

  
      
  • 随机文件访问(fseek等)怎么样?
  •   

怎么样?

答案 1 :(得分:2)

您可以使用std::vector<char>,将其大小调整为文件大小(或其他大小,假设您要处理固定长度的块),然后您可以将其内容传递给类似{{的函数1}}或fread()以下列方式:

fwrite()

这实际上只允许你使用C ++风格的可调整大小的char数组。也许这是一个有用的起点?关键是你可以直接访问向量后面的内存,因为它保证按顺序排列,就像数组一样。

同样的概念适用于std::vector<char> fileContents; fileContents.resize(100); fread(&fileContents[0], 1, 100, theFileStream); - 我只是在std::vector<bool>进入这个问题时要小心,因为我无法告诉你有多大(明智地fread sizeof,因为它取决于平台(8位对比16位对比32位,如果您正在使用微控制器)。

似乎可以优化bool以将每个bool存储在一个位中,因此,除非您知道它将起作用,否则绝对不要尝试直接使用std::vector<bool>后面的内存! / p>