方便地将std :: vector <unsigned char>复制到输入流(std :: istream)对象

Rip*_*Off 7 c++ copy vector istream unsigned-char

我正在尝试使用第三方库中的函数,并期望输入流对象,其中传输二进制文件数据.

签名看起来像这样:

doSomething(const std::string& ...,
          const std::string& ...,
          std::istream& aData,
          const std::string& ...,
          const std::map<std::string, std::string>* ...,
          long ...,
          bool ...);
Run Code Online (Sandbox Code Playgroud)

由于我不能改变/改变这个第三方的lib /功能,我必须适应"我的"代码.在调用的地方,我有一个std :: vector,它包含了预期在istream对象中传递的数据.目前,我将向量复制到流中,通过迭代并使用<<运算符逐字节复制.

我强烈怀疑可能有一种更有效/方便的方式,但迄今为止找不到任何有用的东西.非常感谢任何帮助/您的想法.

最好,JR

Max*_*kin 15

您可以使用一个vector字符作为输入流的底层缓冲区,而无需复制向量的内容:

std::vector<unsigned char> my_vec;
my_vec.push_back('a');
my_vec.push_back('b');
my_vec.push_back('c');
my_vec.push_back('\n');

// make an imput stream from my_vec
std::stringstream is;
is.rdbuf()->pubsetbuf(reinterpret_cast<char*>(&my_vec[0]), my_vec.size());

// dump the input stream into stdout
std::cout << is.rdbuf();
Run Code Online (Sandbox Code Playgroud)

@NeilKirk报告说上述使用方法pubsetbuf是不可移植的.

一种便携方式是使用boost::iostreams库.这是如何从向量构造输入流而不复制其内容:

#include <iostream>
#include <vector>

#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

int main() {
    std::vector<unsigned char> my_vec;
    my_vec.push_back('a');
    my_vec.push_back('b');
    my_vec.push_back('c');
    my_vec.push_back('\n');

    // Construct an input stream from the vector.
    boost::iostreams::array_source my_vec_source(reinterpret_cast<char*>(&my_vec[0]), my_vec.size());
    boost::iostreams::stream<boost::iostreams::array_source> is(my_vec_source);

    // Dump the input stream into stdout.
    std::cout << is.rdbuf();
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么这会被贬低?这是一个有效的选择,imho. (2认同)

Pet*_*ood 7

vector<unsigned char> values;
// ...

stringstream ioss;    
copy(values.begin(), values.end(),
     ostream_iterator<unsigned char>(ioss,","));

// doSomething(a, b, ioss, d, e, f, g);
Run Code Online (Sandbox Code Playgroud)