Utilizza il manipolatore setw in C++

Jinku Hu 12 ottobre 2023
Utilizza il manipolatore setw in C++

Questo post mostra come utilizzare il manipolatore di flusso setw in C++.

Usa la funzione std::setw per modificare la larghezza della prossima operazione di I/O in C++

I manipolatori di flusso sono oggetti speciali che modificano la formattazione di input/output e talvolta generano alcune azioni. La funzione std::endl, probabilmente l’oggetto più comune utilizzato nei flussi di output, è in effetti un manipolatore di flussi. Stampa un carattere di nuova riga e svuota il buffer di output.

D’altra parte, il comando std::setw non genera alcun output. Invece, imposta la larghezza dell’I/O successivo sull’argomento integrale passato. Alcuni manipolatori di flusso utilizzano argomenti; questi devono includere un’intestazione <iomanip>. L’esempio seguente mostra lo scenario di formattazione dell’output di base per il manipolatore setw. Il manipolatore setfill è il compagno naturale di setw. Il primo è utile per modificare il carattere di riempimento con il dato argomento char.

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

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  cout << "setw() : |" << 11 << "|" << endl
       << "setw(4): |" << setw(4) << 11 << "|" << endl
       << "setw(4): |" << 22 << setw(4) << std::setfill('-') << 22 << 33 << "|"
       << endl;

  return EXIT_SUCCESS;
}

Produzione:

setw() : |11|
setw(4): |  11|
setw(4): |22--2233|

In alternativa, possiamo usare il manipolatore setw per restringere il numero di caratteri estratti dall’oggetto stringstream. Questo metodo potrebbe essere utile per i buffer char dichiarati come array fissi. In genere, i manipolatori vengono implementati utilizzando la funzione di sovraccarico.

Ogni manipolatore è la funzione che restituisce un riferimento al flusso. I puntatori a una di queste funzioni vengono passati agli operatori di estrazione/inserimento del flusso, che sono operatori di overload. Le funzioni argomento vengono richiamate dai corpi degli operatori in overload.

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

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::stringstream ss1("hello there");
  char arr[10];

  ss1 >> setw(6) >> arr;
  cout << arr;

  return EXIT_SUCCESS;
}

Produzione:

hello

Una caratteristica utile del manipolatore setw è quella di impostare facilmente il limite sull’input dell’utente che deve essere memorizzato in un buffer di dimensioni fisse. Abbiamo solo bisogno di passare sizeof(buffer) come argomento a setw. Si noti che la chiamata setw interessa una singola operazione di I/O, quindi la larghezza predefinita viene ripristinata automaticamente. La modifica setfill resta invece attiva fino alla variazione esplicita.

#include <iomanip>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::setw;

int main() {
  char buffer[24];
  cout << "username: ";
  cin >> setw(sizeof(buffer)) >> buffer;

  return EXIT_SUCCESS;
}

Produzione:

username:
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