c ++ usa ifstream desde la memoria

c ++ usa ifstream desde la memoria

Aunque el uso de std::istringstream (a veces mencionado erróneamente sin el i inicial); existe una clase de este tipo, pero es más costosa de construir, ya que también configura un flujo de salida) es muy popular, creo que vale la pena señalar que esto hace, como mínimo, una copia de la cadena real (me gustaría sospecho que la mayoría de las implementaciones crean incluso dos copias). La creación de cualquier copia se puede evitar utilizando un búfer de flujo trivial:

struct membuf: std::streambuf {
    membuf(char* base, std::ptrdiff_t n) {
        this->setg(base, base, base + n);
    }
};
membuf sbuf(base, n);
std::istream in(&sbuf);

Para una pequeña área de memoria, la diferencia puede no importar, aunque la asignación guardada también puede notarse allí. Para grandes porciones de memoria, hace una gran diferencia.


La biblioteca estándar ofrece un istream en memoria que también se puede escribir:std::stringstream .

Debe abstraer correctamente su código para que acepte un istream genérico en lugar de un ifstream , construye un stringstream , rellénelo con sus datos y páselo a la función.

Por ejemplo:

const char* data = "Hello world";
std::stringstream str((std::string(data))); // all the parens are needed,
                                            // google "most vexing parse"

do_something_with_istream(str); // pass stream to your code

Si el código que usa el ifstream& podría cambiarse ligeramente para usar un istream& entonces podría cambiar fácilmente entre ifstream y istringstream (para leer datos de la memoria):

void read_data(std::istream& in)
{
}

Personas que llaman:

std::istringstream in_stream(std::string("hello"));
read_data(in_stream);

std::ifstream in_file("file.txt");
read_data(in_file);