2012-02-20 193 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

相關問題