Use a classe STL Stringstream em C++

Jinku Hu 12 outubro 2023
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
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

Artigo relacionado - C++ IO