我在这里读到了一个答案,展示了如何使用以下一(两)行将整个流读取到std::字符串中:
std::istreambuf_iterator<char> eos;
std::string s(std::istreambuf_iterator<char>(stream), eos);
对于类似于将二进制流读取到std::vector
中的操作,为什么我不能简单地用uint8_t
替换char
,用std::vector
替换std::string
?
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> d:\non svn\c++\library\i\file\filereader.cpp(62):错误C2440:":无法从转换'std::basic_ifstream>'到'std::istreambuf_titerator>'1>
带有1>[1]_Elem=uint8_t 1>]1>
没有构造函数可以采用源类型或构造函数重载分辨率不明确
只是类型不匹配。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);
});
ifstream
是char
的流,而不是uint8_t
。您需要basic_ifstream<uint8_t>
或istreambuf_iterator<char>
来匹配类型。
前者可能在没有一定工作量的情况下无法工作,因为库只需要支持char
和wchar_t
的流;所以你可能想要istreambuf_iterator<char>
。