Utilice la clase STL Stringstream en C++

Jinku Hu 12 octubre 2023
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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C++ IO