Procesando strings usando std::istringstream

El std::istringstream es un objeto de clase de string que se utiliza para transmitir la string en diferentes variables y, de manera similar, los archivos se pueden transmitir en strings. Los objetos de esta clase utilizan un búfer de string que contiene una secuencia de caracteres. Se puede acceder a esta secuencia de caracteres como un objeto de string.
Archivo de cabecera: 
 

#include <sstream>

1. Transmisión de enteros desde una string con std::istringstream

Una forma de transmitir una string es usar un objeto de flujo de string de entrada std::istringstream desde el encabezado. Una vez que se ha creado un objeto std::istringstream , la string puede transmitirse y almacenarse mediante el operador de extracción ( >> ). El operador de extracción leerá hasta que se alcance el espacio en blanco o hasta que falle la transmisión.
A continuación se muestra la ilustración de std::istringstream :
 

CPP

// C++ program to illustrate std::istringstream
#include <iostream>
#include <sstream>
#include <string>
using std::istringstream;
using std::string;
using std::cout;
 
// Driver Code
int main()
{
    // Input string
    string a("1 2 3");
 
    // Object class of istringstream
    istringstream my_stream(a);
 
    // Variable to store number n
    int n;
 
    // Stream a number till white space
    // is encountered
    my_stream >> n;
 
    // Print the number
    cout << n << "\n";
}
Producción: 

1

 

El objeto std::istringstream también se puede usar como valor booleano para determinar si la última operación de extracción falló. Esto sucede si no hay más strings en la transmisión. Por ejemplo, si la transmisión todavía tiene más caracteres, podemos transmitir la string nuevamente. 
El operador de extracción >> escribe el flujo en la variable a la derecha del operador y devuelve el objeto std::istringstream , por lo que toda la expresión my_stream >> n es un objeto std::istringstream que devuelve un valor booleano, es decir, verdadero si flujo es posible de lo contrario devolver falso.
A continuación se muestra la implementación del uso de std::istringstream de la manera anterior:
 

Type 1

// C++ program to illustrate std::istringstream
#include <iostream>
#include <sstream>
#include <string>
using std::istringstream;
using std::string;
using std::cout;
 
// Driver Code
int main()
{
    // Input string
    string a("1 2 3");
 
    // Object class of istringstream
    istringstream my_stream(a);
 
    // Variable to store number n
    int n;
 
    // Testing to see if the stream was
    // successful and printing results.
    while (my_stream) {
 
        // Streaming until space is
        // encountered
        my_stream >> n;
 
        // If my_stream is not empty
        if (my_stream) {
            cout << "That stream was successful: "
                 << n << "\n";
        }
 
        // Else print not successful
        else {
            cout << "That stream was NOT successful!"
                 << "\n";
        }
    }
 
    return 0;
}

Type 2

// C++ program to illustrate std::istringstream
#include <iostream>
#include <sstream>
#include <string>
using std::istringstream;
using std::string;
using std::cout;
 
// Driver Code
int main()
{
    // Input string
    string a("1 2 3");
 
    // Object class of istringstream
    istringstream my_stream(a);
 
    // Variable to store number n
    int n;
 
    // Testing to see if the stream was
    // successful and printing results.
    while (my_stream >> n) {
 
        cout << "That stream was successful: "
             << n << "\n";
    }
 
    cout << "That stream was NOT successful!"
         << "\n";
    return 0;
}
Producción: 

That stream was successful: 1
That stream was successful: 2
That stream was successful: 3
That stream was NOT successful!

 

2. Strings con tipos mixtos

En las ilustraciones anteriores, la string contiene solo espacios en blanco y caracteres que se pueden convertir a int. Si la string tiene tipos mixtos, es decir, contiene más de un tipo de datos en el flujo, entonces se puede usar como se ilustra a continuación.
A continuación se muestra la ilustración de std::istringstream para los tipos mixtos:
Programa 1:
 

CPP

// C++ program to illustrate std::istringstream
// when string has integer followed by character
#include <iostream>
#include <sstream>
#include <string>
using std::istringstream;
using std::string;
using std::cout;
 
// Driver Code
int main()
{
    // Input string
    string str("1, 2, 3");
 
    // Object class of istringstream
    istringstream my_stream(str);
 
    // Variable to store the number n
    // and character ch
    char c;
    int n;
 
    // Traverse till input stream is valid
    while (my_stream >> n >> c) {
 
        cout << "That stream was successful: "
             << n << " " << c << "\n";
    }
    cout << "The stream has failed."
         << "\n";
 
    return 0;
}
Producción: 

That stream was successful: 1,
That stream was successful: 2,
The stream has failed.

 

Programa 2:
 

CPP

// C++ program to illustrate std::istringstream
// to tokenize the string
#include <iostream>
#include <sstream>
#include <string>
using std::istringstream;
using std::string;
using std::cout;
 
// Driver Code
int main()
{
    // Input string
    string str("abc, def,   ghi");
 
    // Object class of istringstream
    istringstream my_stream(str);
 
    // To store the stream string
    string token;
 
    size_t pos = -1;
 
    // Traverse till stream is valid
    while (my_stream >> token) {
 
        // If ',' is found then tokenize
        // the string token
        while ((pos = token.rfind(','))
               != std::string::npos) {
            token.erase(pos, 1);
        }
 
        // Print the tokenize string
        cout << token << '\n';
    }
}
Producción: 

abc
def
ghi

 

Referencia: http://www.cplusplus.com/reference/sstream/istringstream/
 

Publicación traducida automáticamente

Artículo escrito por psycho_incredible y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *