Utiliser la classe STL Stringstream en C++

Jinku Hu 12 octobre 2023
Utiliser la classe STL Stringstream en C++

Cet article montrera comment utiliser la classe STL stringstream en C++.

Utilisez la classe stringstream pour effectuer des opérations d’entrée/sortie sur des flux de chaînes en C++

Il existe généralement trois types de classes de bibliothèques d’E/S basées sur les flux STL : à base de caractères, de fichier et de chaîne. Chacun d’eux est généralement utilisé pour les scénarios les mieux adaptés à leurs propriétés. À savoir, les chaînes de chaîne ne fournissent pas de tampon de chaîne temporaire pour stocker leurs données, contrairement à la connexion à un canal d’E/S. La classe std::stringstream implémente les opérations d’entrée/sortie pour les flux basés sur des chaînes. Vous pouvez traiter un objet de ce type comme un tampon de chaîne pouvant être manipulé à l’aide d’opérations de flux et de fonctions membres puissantes.

Deux des fonctions les plus utiles incluses dans la classe stringstream sont str et rdbuf. Le premier est utilisé pour récupérer la copie de l’objet chaîne sous-jacent. Notez que l’objet renvoyé est temporaire et détruit la fin de l’expression. Ainsi, vous devez appeler une fonction à partir du résultat de la fonction str.

Le même processus peut être appelé avec un objet chaîne comme argument pour définir le contenu du stringstream avec la valeur fournie. Vous devez toujours appeler la fonction str sur l’objet stringstream lorsqu’il est inséré dans un flux cout, sinon une erreur de compilation se produira. Notez également que le comportement précédent est implémenté depuis le standard C++11.

D’autre part, la fonction membre rdbuf peut être utilisée pour récupérer le pointeur vers l’objet chaîne brute sous-jacent. Celui-ci agit comme si l’objet string était passé au flux cout. Par conséquent, le contenu du tampon est imprimé, comme illustré dans l’exemple suivant.

#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;
}

Production:

hello, the number 123 and 32 are printed Hello there

Une autre caractéristique d’une classe stringstream est qu’elle peut convertir des valeurs numériques en un type de chaîne. Notez que l’extrait de code précédent a inséré les littéraux de chaîne et les nombres dans un objet stringstream. De plus, lorsque nous récupérons le contenu à l’aide de la fonction str, l’ensemble est de type chaîne et peut être traité comme tel.

Il existe trois objets flux distincts basés sur des chaînes : stringstream, istringstream et ostringstream. Les deux derniers sont différents car ils ne fournissent respectivement que des opérations d’entrée et de sortie ; cela implique que certaines fonctions membres n’affectent que certains types de flux.

Par exemple, l’exemple de code suivant appelle la fonction putback sur les objets stringstream et istringstream séparément. La fonction membre putback est utilisée pour ajouter le caractère unique au flux d’entrée. Ainsi, il ne réussit que sur un objet stringstream qui fournit des propriétés d’entrée et de sortie.

#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;
}

Production:

Hello there !putback failed
Auteur: 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

Article connexe - C++ IO