2012-02-20 17 views
7

Próbuję użyć funkcji, która znajduje się w lib innej firmy i oczekuje obiektu strumienia wejściowego, w którym plik binarny dane są transportowane.Dogodnie kopiuj std :: wektor <unsigned char> do strumienia wejściowego (std :: istream) obiekt

Podpis wygląda tak:

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

Ponieważ nie mogę zmienić/zmienić to 3rd party lib/funkcję, muszę dostosować w "moim" kodu. W miejscu wywołania mam wektor std :: zawierający dane, które powinny zostać przekazane w obiekcie istream. Obecnie kopiuję wektor do strumienia, poprzez jego iterację i użycie operatora < < do skopiowania bajtu po bajcie.

Zdecydowanie podejrzewam, że może istnieć bardziej efektywny/wygodny sposób, ale do tej pory nie można było znaleźć żadnych przydatnych informacji. Każda pomoc/twoje myśli są bardzo cenne.

Best, JR

+2

Nie widzę, jak można ** wpisać ** do ** strumienia wejściowego **. –

+0

Tak, jak dokładnie używasz operatora << na ** istream **? – HighCommander4

+0

Istotne? http://stackoverflow.com/questions/9319813/overloading-operator-for-c-stl-containers/9320896#9320896 – BoBTFish

Odpowiedz

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

Dzięki za skierowanie mnie we właściwym kierunku! 'Stringstream ss; copy (values.begin(), values.end(), ostream_iterator (ss, "")); ' działa idealnie! –

15

Można użyć vector znaków jako bufor bazowego dla strumienia wejściowego bez kopiowania zawartości wektora:

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 zgłasza, że ​​the above method of using pubsetbuf is non-portable.

Jednym przenośnym sposobem jest użycie biblioteki boost::iostreams. Oto, jak skonstruować strumień wejściowy z wektora bez kopiowania jego zawartości:

#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

Dlaczego zostało to odrzucone? To ważna opcja, imho. – jrok

+0

To jest dobra opcja, bardziej wydajna niż moja odpowiedź. –

+0

Wskaźnik do danych wektorowych jest łatwo unieważniany. Niemniej jednak, tymczasowość strumienia struny sprawia, że ​​jest on w miarę bezpieczny. Mając to na uwadze, jest to dobra odpowiedź. – Zoomulator

Powiązane problemy