如何用std :: vector 做文件I/O?

问题描述:

我需要实现一个布尔数据容器,它将存储相当多的变量。我想我可以使用char*并实现C风格的宏访问器,但我更愿意将它包装在std::结构中。 std::bitset<size_t>似乎不实用,因为它具有固定的编译期间大小。如何用std :: vector <bool>做文件I/O?

因此,我留下了std::vector<bool>这是空间优化;它有一个很棒的布尔型存取器。

  1. 有没有办法做这样的事情,直接喂从中指针fwrite()

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

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

  4. 什么随机文件访问(fseek等)?

编辑:我已经决定在有我的要求要求功能的新类来包装一个std::vector<unsigned int>

+0

这是一个好主意 - 但我没有增加部署,我不确定这样做的成本是否会带来收益。 – 2013-05-14 12:09:14

你可以使用一个std::vector<char>,它调整到文件的大小(或其他尺寸,说要处理固定长度块),那么你可以通过它的内容的功能,像fread()fwrite()以下方式:

std::vector<char> fileContents; 
fileContents.resize(100); 
fread(&fileContents[0], 1, 100, theFileStream); 

这真的只是允许你有一个可调整大小的字符数组,在C + +风格。也许这是一个有用的起点?重点是你可以直接访问向量背后的内存,因为它可以保证按顺序排列,就像数组一样。

同样的概念也将努力为 std::vector<bool> - 我只是要小心,当 fread荷兰国际集团到这是从我的头顶,我不能告诉你一个 bool有多大( sizeof明智)是的,因为它取决于平台(如果您正在使用微控制器,则需要8位,16位和32位)。

看来std::vector<bool>可以优化每个BOOL存储单个位,所以,绝对不要尝试使用内存vector<bool>后面直接,除非你知道它要工作!

+0

这是矢量的专用版本,用于bool类型的元素并优化空间。 - http://www.cplusplus.com/reference/vector/vector-bool/ 但是,在下一个项目符号中,它指出可能意味着未定义行为的单词“may”.. – 2013-05-14 12:18:26

+0

哇,我不知道那种在STL中进行优化......那么,我会避免使用它。对我来说,使用'std :: vector '。除非你正在处理GB大小的文件,否则我认为你应该没问题,当然这取决于很多因素。 – 2013-05-14 12:24:15

+0

尽管如此,你可以使用'vector ',并用循环来填充它。这不会比使用'fread'更有效率,它可能也会使用一个循环(我的意思是它可以使用一些像共享内存页面或虚拟内存或其他类似的东西,但真实的我认为它只会复制仍然是O(n)的内存)。 – 2013-05-14 12:27:48

  • 有没有办法做这样的事情,直接养活一个指针从它使用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等)?

怎么样?