2012-02-20 218 views
7

我试图使用第三方库中的函数,并期望输入流对象中的二进制文件数据被传输。方便地将std :: vector <unsigned char>复制到输入流(std :: istream)对象

签名看起来像这样:

doSomething(const std::string& ..., 
      const std::string& ..., 
      std::istream& aData, 
      const std::string& ..., 
      const std::map<std::string, std::string>* ..., 
      long ..., 
      bool ...); 

既然不能改变/改变这种第三方的lib /功能,我在“我”的代码来适应。在调用的地方,我有一个std :: vector,它包含预期要在istream对象中传递的数据。目前我通过遍历它将矢量复制到流中,并使用运算符逐字节地复制。

我强烈怀疑可能有更有效/更方便的方法,但到目前为止找不到有用的东西。任何帮助/你的想法,不胜感激。

最佳, JR

+2

我不明白你希望**写入**输入**流。 – 2012-02-20 08:49:08

+0

是的,您如何在** istream **上使用<<运算符? – HighCommander4 2012-02-20 08:50:14

+0

相关? http://stackoverflow.com/questions/9319813/overloading-operator-for-c-stl-containers/9320896#9320896 – BoBTFish 2012-02-20 08:52:35

回答

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); 
+0

感谢您指点我正确的方向! 'stringstream ss; copy(values.begin(),values.end(), ostream_iterator (ss,“”));' 完美的作品! – 2012-02-21 14:46:45

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(); 

@NeilKirk报告,the above method of using pubsetbuf is non-portable

一种便携的方式是使用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(); 
} 
+2

为什么这会降低投票率?这是一个有效的选择,恕我直言。 – jrok 2012-02-20 09:10:55

+0

这是一个不错的选择,比我的答案更有效率。 – 2012-02-21 15:19:32

+0

指向矢量数据的指针很容易失效。尽管如此,串流的临时性使其相当安全。考虑到这一点,这是一个很好的答案。 – Zoomulator 2014-08-28 08:00:14

相关问题