Streams (fluxos) em C++

Introdução

C++ oferece diversos recursos para acessar arquivos, ou mais genericamente streams. O nome stream representa um fluxo de entrada ou de saída, e pode ser entendido de diversas formas. Por exemplo, cout é um fluxo de saída e cin é um fluxo de entrada, ambos associados com o terminal. Da mesma forma, pode-se usar fluxos de saida para strings, por exemplo, que permitem compor strings como se estivéssemos escrevendo na tela.

String Streams

String stream é um recurso que permite escrevermos em uma string como se estivéssemos realizando saída na tela (ex: via cout). Dessa forma, é possível utilizar todas as funcionalidades da iostream (formatos, alinhamento, precisão numérica, tamanho de campo, etc) em uma string.

É útil, por exemplo, para retornarmos informações sobre um objeto sob forma de string, especialmente quando é preciso combinar dados numéricos com dados não-numéricos.

Para utilizar o recurso de string stream, é necessário primeiramente incluir o header sstream. A partir daí, deve-se declarar um objeto do tipo ostringstream (output string stream) e utilizá-lo como se fosse uma saída padrão, ou seja, da mesma forma que cout:

Finalmente, para se obter a string armazenada no objeto ostringstream usa-se o método str:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <sstream>

using namespace std;

string converte(float valor)
{
	ostringstream aux;  // Declara o string stream de saída chamado aux
	aux << "Exemplo de saída em string ";  // Escreve em aux
	aux << fixed << setprecision(2) << sqrt(valor); // idem
	return aux.str(); // Retorna a string resultante a partir do stream aux
}

int main()
{
	float v;
	cout << "Digite o valor: ";
	cin >> v;
	cout << converte(v);
}

Note que se o objetivo for apenas concatenar (agrupar) duas ou mais strings, não é necessário usar string stream: basta empregar o operador de concatenação (+).

É muito comum a criação de um método denominado toString, que tem o papel de retornar uma representação do objeto armazendo como uma string. Por exemplo:

#include <iostream>
#include <sstream>
#include <string>

class Pessoa
{
   private:
      string nome;
      string CPF;
      int idade;

   public:

      Pessoa(string n, string cpf, int i) {
        ...
      }

      ...
      string toString();
      ...
};

...
string Pessoa::toString() {
	// Cria um fluxo de saída em uma string
	ostringstream aux;

	// "Escreve" os dados no fluxo
	aux << nome << " - " << CPF << " - " << idade;

	// Retorna string contida no fluxo
	return aux.str();
}