Usa la classe STL Stringstream in C++

Jinku Hu 12 ottobre 2023
Usa la classe STL Stringstream in C++

Questo articolo dimostrerà come utilizzare la classe STL stringstream in C++.

Utilizzare la classe stringstream per eseguire operazioni di input/output su flussi di stringhe in C++

Esistono generalmente tre tipi di classi di libreria I/O basate su flusso STL: basate su caratteri, file e stringhe. Ciascuno di essi viene solitamente utilizzato per gli scenari più adatti alle proprie proprietà. Vale a dire, le stringhe di stringa non forniscono un buffer di stringa temporaneo per memorizzare i propri dati, a differenza della connessione a un canale di I/O. La classe std::stringstream implementa operazioni di input/output per flussi basati su stringhe. È possibile trattare un oggetto di questo tipo come un buffer di stringa che può essere manipolato utilizzando operazioni di flusso e potenti funzioni membro.

Due delle funzioni più utili incluse nella classe stringstream sono str e rdbuf. Il primo viene utilizzato per recuperare la copia dell’oggetto stringa sottostante. Si noti che l’oggetto restituito è temporaneo e distrugge la fine dell’espressione. Quindi, dovresti chiamare una funzione dal risultato della funzione str.

Lo stesso processo può essere chiamato con un oggetto stringa come argomento per impostare il contenuto dello stringstream con il valore fornito. Dovresti sempre chiamare la funzione str sull’oggetto stringstream quando viene inserito in un flusso cout, altrimenti si verificherà un errore del compilatore. Si noti inoltre che il comportamento precedente è implementato dallo standard C++11.

D’altra parte, la funzione membro rdbuf può essere utilizzata per recuperare il puntatore all’oggetto stringa non elaborato sottostante. Questo si comporta come se l’oggetto stringa fosse passato al flusso cout. Di conseguenza, viene stampato il contenuto del buffer, come mostrato nell’esempio seguente.

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

Produzione:

hello, the number 123 and 32 are printed Hello there

Un’altra caratteristica di una classe stringstream è che può convertire valori numerici in un tipo stringa. Si noti che il frammento di codice precedente ha inserito i letterali e i numeri della stringa in un oggetto stringstream. Inoltre, quando recuperiamo i contenuti utilizzando la funzione str, l’intera cosa è di tipo stringa e può essere trattata come tale.

Esistono tre distinti oggetti stream basati su stringhe: stringstream, istringstream e ostringstream. Gli ultimi due sono diversi perché forniscono rispettivamente solo operazioni di input e output; ciò implica che alcune funzioni membro influiscano solo su determinati tipi di flusso.

Ad esempio, il seguente esempio di codice chiama la funzione putback sugli oggetti stringstream e istringstream separatamente. La funzione membro putback viene utilizzata per aggiungere il singolo carattere al flusso di input. Pertanto, ha successo solo su un oggetto stringstream che fornisce proprietà di input e output.

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

Produzione:

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

Articolo correlato - C++ IO