2012-02-20 25 views
7

Estoy tratando de hacer uso de una función que viene en una lib de terceros y espera un objeto de flujo de entrada en qué archivo binario los datos son transportadosCopie convenientemente std :: vector <unsigned char> al objeto de entrada de flujo (std :: istream)

Firma parece que:

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

Ya que no puedo alterar/cambiar esta tercera parte lib/función, tengo que adaptar en "mi" código. En el lugar de la llamada, tengo un std :: vector que contiene los datos que se espera que pasen en un objeto istream. Actualmente copio el vector en la secuencia, iterando sobre él y usando el operador < < para copiar byte por byte.

Sospecho que podría haber una forma más efectiva/conveniente, pero no pude encontrar nada útil hasta ahora. Cualquier ayuda/sus pensamientos son muy apreciados.

mejor, JR

+2

No veo cómo espera ** escribir ** en una ** entrada ** de transmisión. –

+0

Sí, ¿cómo se usa exactamente el operador << en ** istream **? – HighCommander4

+0

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

Respuesta

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

¡Gracias por indicarme la dirección correcta! 'stringstream ss; copia (values.begin(), values.end(), ostream_iterator (ss, "")); ' funciona a la perfección! –

15

Se puede utilizar un vector de caracteres como un búfer subyacente para un flujo de entrada sin copiar el contenido del 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 informa que the above method of using pubsetbuf is non-portable.

Una forma portátil es usar la biblioteca boost::iostreams. Esta es la forma de construir un flujo de entrada desde un vector sin copiar su contenido:

#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

¿Por qué fue esto downvoted? Es una opción válida, yo. – jrok

+0

Esta es una buena opción, más eficiente que mi respuesta. –

+0

El puntero a los datos vectoriales se invalida fácilmente. Sin embargo, la temporalidad del stringstream lo hace razonablemente seguro. Con eso en mente, es una buena respuesta. – Zoomulator

Cuestiones relacionadas