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.
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 objetostreambuf
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ónstr()
para obtener la cadena de lastringstream
, modificarla y luego establecerla nuevamente en lastringstream
utilizando nuevamente la funciónstr()
. 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”