es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando la función ignore de stringstream.

Estoy tratando de usar un stringstream como un búfer pero no puedo actualizar el objeto subyacente streambuf:

#include <iostream>
#include <sstream>

int main() {
   std::stringstream ss(std::ios_base::app|std::ios_base::in|std::ios_base::out); //ostringstream da el mismo resultado
   ss << "foo";
   std::cout << "posición obtener: " << ss.tellg() << std::endl;
   std::cout << "posición poner: " << ss.tellp() << std::endl;
   ss << "b";
   std::cout << "posición obtener: " << ss.tellg() << std::endl;
   std::cout << "posición poner: " << ss.tellp() << std::endl;
   char c;
   ss >> c;
   std::cout << "posición obtener: " << ss.tellg() << std::endl;
   std::cout << "posición poner: " << ss.tellp() << std::endl;
   ss.ignore(1);
   std::cout << "posición obtener: " << ss.tellg() << std::endl;
   std::cout << "posición poner: " << ss.tellp() << std::endl;

   std::cout << ss.str() << std::endl;
   return 0;
}

produce:

posición obtener: 0
posición poner: 3
posición obtener: 0
posición poner: 4
posición obtener: 1
posición poner: 4
posición obtener: 2
posición poner: 4
foob

¿Es posible forzar una realocación del objeto subyacente de streambuf? Si no es posible, ¿esta realocación es automática y en qué circunstancias se activa?

Sé que puedo usar ss.str para cambiar el búfer subyacente. Pero es engorroso usarlo para actualizar manualmente el búfer a la versión de substr.

Nota: Estoy realizando un proyecto escolar y debo compilar en c++98, por lo tanto, si tienes una solución compatible, sería muy apreciada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    En C++98, no es posible forzar una realocación del objeto subyacente streambuf. La realocación es automática y se activa cuando las operaciones de inserción y extracción requieren más espacio del que el búfer actual puede contener. Cuando esto sucede, el objeto streambuf asigna un búfer más grande, copia el contenido actual del búfer al nuevo búfer y libera el búfer antiguo.

    Si necesita actualizar el búfer subyacente a una versión de substr, puede utilizar la función str() para obtener la cadena de la stringstream, modificarla y luego establecerla nuevamente en la stringstream utilizando nuevamente la función str(). Por ejemplo:

    “`c++
    std::stringstream ss;
    ss << “Hola Mundo”;
    std::string str = ss.str(); // Obtener la cadena de ss
    str = str.substr(0, 5); // Modificar la cadena
    ss.str(str); // Establecer la cadena modificada de nuevo en ss
    std::cout << ss.str() << std::endl; // Salida: “Hola”


    Alternativamente, puede crear un nuevo objeto `stringstream` con la cadena modificada e intercambiarlo con la `stringstream` original utilizando la función `swap()`. Por ejemplo: ```c++ std::stringstream ss1; ss1 << "Hola Mundo"; std::string str = ss1.str(); // Obtener la cadena de ss str = str.substr(0, 5); // Modificar la cadena std::stringstream ss2(str); // Crear un nuevo stringstream con la cadena modificada ss1.swap(ss2); // Intercambiar ss1 con ss2 std::cout << ss1.str() << std::endl; // Salida: "Hola"

Comments are closed.