sort geeksforgeeks functions c++ stl

c++ - geeksforgeeks - stl map



C++ stl stringstream acceso directo de buffer (4)

Bueno, si le preocupa seriamente el almacenamiento, puede acercarse al metal. basic_stringstream tiene un método, rdbuf () que devuelve su basic_stringbuf (que se deriva de basic_streambuf ). A continuación, puede utilizar los punteros eback () , egptr () y gptr () para acceder a los caracteres directamente desde el búfer. He utilizado esta maquinaria en el pasado para implementar un búfer personalizado con mi semántica deseada, por lo que es factible.

¡Cuidado, esto no es para los débiles de corazón! Dedique unos días a leer el Estándar C ++ IOStreams y Locales , o referencias similares, y tenga cuidado ...

esto debería ser bastante común, pero me parece fascinante no encontrar una solución directa.

Básicamente, leí en un archivo a través de la red en un stringstream. Esta es la declaración:

std::stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);

Ahora tengo una biblioteca C que quiere acceso directo al fragmento de lectura de la memoria. ¿Cómo lo consigo? El acceso de solo lectura está bien. Después de que se realiza la función C, elimino el flujo de memoria, sin necesidad de hacerlo.

str() copia el búfer, lo que parece innecesario y duplica la memoria.

¿Me estoy perdiendo algo obvio? Tal vez una clase stl diferente funcionaría mejor.

Editar : Aparentemente, no se garantiza que el flujo de secuencias se almacene de manera continua. ¿Que es?

si uso vector<char> ¿cómo obtengo el buffer byte?


std::stringstream no almacena (necesariamente) su buffer contiguamente pero puede asignar fragmentos a medida que se llena gradualmente. Si luego desea todos sus datos en una región contigua de la memoria, deberá copiarlos y eso es lo que str() hace por usted.

Por supuesto, si desea usar o escribir una clase con una estrategia de almacenamiento diferente, entonces puede hacerlo, pero no necesita usar std::stringstream en absoluto.


Puedes tomar el control total del buffer usado al escribir el buffer tú mismo y usar ese buffer en el stringstream

stringstream membuf(std::ios::in | std::ios::out | std::ios::binary); membuf.rdbuf(yourVeryOwnStreamBuf);

Su propio búfer debe derivarse de basic_streambuf y anular los métodos sync() y overflow() apropiada.

Para su representación interna probablemente pueda usar algo como vector< char > y reserve() al tamaño necesario para que no se realicen reasignaciones ni copias.

Esto implica que conoces un límite superior para el espacio necesario por adelantado. Pero si no conoce el tamaño por adelantado y necesita un búfer contiguo al final, las copias son inevitables.


Puedes llamar a str() para recuperar una std :: string. Desde allí, puede llamar a c_str() en std :: string para obtener un char* . Tenga en cuenta que c_str () no es oficialmente compatible para este uso, pero todos lo usan de esta manera :)

Editar

Esta es probablemente una mejor solución: std::istream::read . Del ejemplo en esa página:

buffer = new char [length]; // read data as a block: is.read (buffer,length);