read good c++ input stream

c++ - good - Creando un flujo de entrada desde la memoria constante



ifstream en c++ (2)

La única forma sería crear una subclase std :: istream (que también requiere subclasificar std :: streambuf) para crear su propia clase de secuencia que se lee desde la memoria constante.

No es tan fácil como parece porque las clases de flujo de la biblioteca estándar de C ++ son bastante desordenadas y están mal diseñadas. No creo que valga la pena a menos que la necesites para escalar mucho.

Tengo algunos datos en un búfer apuntado por un puntero const char* . Los datos son solo una cadena ASCII. Sé que su tamaño. Me gustaría poder leerlo de la misma manera en que se leen los datos de las secuencias. Estoy buscando una solución que me permita escribir código como este:

// for example, data points to a string "42 3.14 blah" MemoryStreamWrapper in(data, data_size); int x; float y; std::string w; in >> x >> y >> w;

Condición importante: los datos no deben copiarse ni alterarse de ninguna manera (de lo contrario, solo usaría un flujo de cadenas. Que yo sepa, no es posible crear un flujo de cadenas desde un puntero de carácter constante sin copiar los datos. )


La forma de hacerlo es crear un búfer de flujo adecuado. Esto se puede hacer, por ejemplo, de esta manera:

#include <streambuf> #include <istream> struct membuf: std::streambuf { membuf(char const* base, size_t size) { char* p(const_cast<char*>(base)); this->setg(p, p, p + size); } }; struct imemstream: virtual membuf, std::istream { imemstream(char const* base, size_t size) : membuf(base, size) , std::istream(static_cast<std::streambuf*>(this)) { } };

Lo único incómodo es el const_cast<char*>() en el búfer de flujo: el búfer de flujo no cambiará los datos, pero la interfaz aún requiere que se use char* , principalmente para facilitar el cambio del búfer en " normales "buffers de corriente. Con esto, puedes usar imemstream como un flujo de entrada normal:

imemstream in(data, size); in >> value;