Use a classe STL Stringstream em C++
Este artigo demonstrará como usar a classe STL stringstream
em C++.
Use a classe stringstream
para conduzir operações de entrada / saída em fluxos de string em C++
Geralmente, há três tipos de classes de biblioteca de E / S baseadas em fluxo STL: baseada em caracteres, arquivo e string. Cada um deles é geralmente utilizado para cenários mais adequados às suas propriedades. Ou seja, strings de string não fornecem um buffer de string temporário para armazenar seus dados, em contraste com a conexão a algum canal de E / S. A classe std::stringstream
implementa operações de entrada / saída para fluxos baseados em string. Você pode tratar um objeto desse tipo como um buffer de string que pode ser manipulado usando operações de fluxo e funções de membro poderosas.
Duas das funções mais úteis incluídas na classe stringstream
são str
e rdbuf
. O primeiro é usado para recuperar a cópia do objeto string subjacente. Observe que o objeto retornado é temporário e destrói o final da expressão. Portanto, você deve chamar uma função a partir do resultado da função str
.
O mesmo processo pode ser chamado com um objeto string como um argumento para definir o conteúdo do stringstream
com o valor fornecido. Você deve sempre chamar a função str
no objeto stringstream
quando ele está sendo inserido em um fluxo cout
, ou então ocorrerá um erro do compilador. Observe também que o comportamento anterior é implementado desde o padrão C++ 11.
Por outro lado, a função de membro rdbuf
pode ser usada para recuperar o ponteiro para o objeto de string bruto subjacente. Este age como se o objeto string fosse passado para o fluxo cout
. Conseqüentemente, o conteúdo do buffer é impresso, conforme mostrado no exemplo a seguir.
#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;
}
Resultado:
hello, the number 123 and 32 are printed Hello there
Outro recurso de uma classe stringstream
é que ela pode converter valores numéricos em um tipo de string. Observe que o fragmento de código anterior inseriu os literais de string e números em um objeto stringstream
. Além disso, quando recuperamos o conteúdo usando a função str
, tudo é um tipo de string e pode ser tratado como tal.
Existem três objetos de fluxo baseados em string distintos: stringstream
, istringstream
e ostringstream
. Os dois últimos são diferentes porque fornecem apenas operações de entrada e saída, respectivamente; isso implica que algumas funções de membro afetam apenas certos tipos de fluxo.
Por exemplo, o exemplo de código a seguir chama a função putback
nos objetos stringstream
e istringstream
separadamente. A função de membro putback
é usada para anexar o único caractere ao fluxo de entrada. Assim, ele só tem sucesso em um objeto stringstream
que fornece propriedades de entrada e saída.
#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;
}
Resultado:
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