如何将整个流读取到std::向量中



我在这里读到了一个答案,展示了如何使用以下一(两)行将整个流读取到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);
              });

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

前者可能在没有一定工作量的情况下无法工作,因为库只需要支持charwchar_t的流;所以你可能想要istreambuf_iterator<char>

相关内容

  • 没有找到相关文章

最新更新