Utilice la clase STL Stringstream en C++
Este artículo demostrará cómo utilizar la clase STL stringstream
en C++.
Utilice la clase stringstream
para realizar operaciones de entrada / salida en secuencias de cadenas en C++
En general, existen tres tipos de clases de biblioteca de E / S basadas en secuencias de STL: basadas en caracteres, archivos y cadenas. Cada uno de ellos se utiliza generalmente para escenarios que mejor se adaptan a sus propiedades. Es decir, las cadenas de cadenas no proporcionan un búfer de cadena temporal para almacenar sus datos, en contraste con la conexión a algún canal de E / S. La clase std::stringstream
implementa operaciones de entrada / salida para flujos basados en cadenas. Puede tratar un objeto de este tipo como un búfer de cadena que se puede manipular mediante operaciones de flujo y potentes funciones miembro.
Dos de las funciones más útiles incluidas en la clase stringstream
son str
y rdbuf
. El primero se utiliza para recuperar la copia del objeto de cadena subyacente. Tenga en cuenta que el objeto devuelto es temporal y destruye el final de la expresión. Por lo tanto, debe llamar a una función desde el resultado de la función str
.
El mismo proceso se puede llamar con un objeto de cadena como argumento para establecer el contenido del stringstream
con el valor proporcionado. Siempre debe llamar a la función str
en el objeto stringstream
cuando se inserta en un flujo cout
, de lo contrario se producirá un error del compilador. Tenga en cuenta también que el comportamiento anterior se implementa desde el estándar C++ 11.
Por otro lado, la función miembro rdbuf
se puede utilizar para recuperar el puntero al objeto de cadena sin formato subyacente. Éste actúa como si el objeto de cadena se pasara al flujo cout
. En consecuencia, se imprime el contenido del búfer, como se muestra en el siguiente ejemplo.
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss1;
ss1 << "hello, the number " << 123 << " and " << 32 << " are printed" << endl;
cout << ss1.str();
stringstream ss2("Hello there");
cout << ss2.rdbuf();
return EXIT_SUCCESS;
}
Producción :
hello, the number 123 and 32 are printed
Hello there
Otra característica de una clase stringstream
es que puede convertir valores numéricos en un tipo de cadena. Observe que el fragmento de código anterior insertó los literales y números de cadena en un objeto stringstream
. Además, cuando recuperamos el contenido usando la función str
, todo es un tipo de cadena y puede tratarse como tal.
Hay tres objetos de flujo distintos basados en cadenas: stringstream
, istringstream
y ostringstream
. Los dos últimos son diferentes porque solo proporcionan operaciones de entrada y salida, respectivamente; esto implica que algunas funciones miembro solo afectan a ciertos tipos de flujo.
Por ejemplo, el siguiente ejemplo de código llama a la función putback
en los objetos stringstream
e istringstream
por separado. La función de miembro putback
se utiliza para agregar el carácter único al flujo de entrada. Por lo tanto, solo tiene éxito en un objeto stringstream
que proporciona propiedades de entrada y salida.
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::istringstream;
using std::stringstream;
int main() {
stringstream ss2("Hello there");
cout << ss2.rdbuf();
if (ss2.putback('!'))
cout << ss2.rdbuf() << endl;
else
cout << "putback failed" << endl;
istringstream ss3("Hello there");
ss3.get();
if (ss3.putback('!'))
cout << ss3.rdbuf() << endl;
else
cout << "putback failed" << endl;
return EXIT_SUCCESS;
}
Producción :
Hello there!
putback failed
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook