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