我读了an answer here,展示了如何使用以下一(2)个内容将整个流读入std :: string:
std::istreambuf_iterator<char> eos;
std::string s(std::istreambuf_iterator<char>(stream), eos);
为了做类似的事情,将二进制流读入std::vector
,为什么我不能简单地用char
和uint8_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;
没有构造函数可以采用源类型或构造函数重载 决议是模糊的
答案 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)
ifstream
是char
的流,而不是uint8_t
。对于要匹配的类型,您需要basic_ifstream<uint8_t>
或istreambuf_iterator<char>
。
如果没有一些工作,前者可能无法运作,因为只需要支持char
和wchar_t
的流;所以你可能想要istreambuf_iterator<char>
。