如何将整个流读入std :: vector?

时间:2014-10-27 14:03:14

标签: c++ vector stl stream ifstream

我读了an answer here,展示了如何使用以下一(2)个内容将整个流读入std :: string:

std::istreambuf_iterator<char> eos;    
std::string s(std::istreambuf_iterator<char>(stream), eos);

为了做类似的事情,将二进制流读入std::vector,为什么我不能简单地用charuint8_t替换std::string std::vector

auto stream = std::ifstream(path, std::ios::in | std::ios::binary);    
auto eos = std::istreambuf_iterator<uint8_t>();
auto buffer = std::vector<uint8_t>(std::istreambuf_iterator<uint8_t>(stream), eos);

以上产生编译器错误(VC2013):

  

1&gt; d:\ non-svn \ c ++ \ library \ i \ file \ filereader.cpp(62):错误C2440:   '':无法转换   '的std :: basic_ifstream&GT;'至   '的std :: istreambuf_iterator&GT;' 1 GT;
  用1> [1> _Elem = uint8_t 1&gt; ] 1&gt;
  没有构造函数可以采用源类型或构造函数重载   决议是模糊的

2 个答案:

答案 0 :(得分:11)

只是类型不匹配。 ifstream只是一个typedef:

typedef basic_ifstream<char> ifstream;

因此,如果您想使用不同的基础类型,您只需告诉它:

std::basic_ifstream<uint8_t> stream(path, std::ios::in | std::ios::binary);    
auto eos = std::istreambuf_iterator<uint8_t>();
auto buffer = std::vector<uint8_t>(std::istreambuf_iterator<uint8_t>(stream), eos);

这适合我。

或者,由于Dietmar说这可能有点粗略,你可以做点什么:

auto stream = std::ifstream(...);
std::vector<uint8_t> data;

std::for_each(std::istreambuf_iterator<char>(stream),
              std::istreambuf_iterator<char>(),
              [&data](const char c){
                  data.push_back(c);
              });

答案 1 :(得分:5)

ifstreamchar的流,而不是uint8_t。对于要匹配的类型,您需要basic_ifstream<uint8_t>istreambuf_iterator<char>

如果没有一些工作,前者可能无法运作,因为只需要支持charwchar_t的流;所以你可能想要istreambuf_iterator<char>