Input/Output Formattato
Controllare l’aspetto dell’output
Sezione intitolata “Controllare l’aspetto dell’output”Il formato predefinito non è sempre adatto: un prezzo può richiedere due cifre decimali e una tabella colonne allineate.
La libreria <iomanip> contiene gli strumenti per controllare la visualizzazione dei dati:
#include <iostream>#include <iomanip>using namespace std;Quante cifre decimali: setprecision
Sezione intitolata “Quante cifre decimali: setprecision”Di default, cout mostra 6 cifre significative. Con setprecision puoi cambiarle:
double pi = 3.14159265358979;
cout << pi << endl; // 3.14159 (default: 6 cifre)cout << setprecision(3) << pi << endl; // 3.14cout << setprecision(10) << pi << endl; // 3.141592654Per controllare le cifre dopo la virgola (non le cifre significative), aggiungi fixed:
double x = 1234.5678;
cout << fixed << setprecision(2) << x << endl; // 1234.57cout << fixed << setprecision(4) << x << endl; // 1234.5678cout << fixed << setprecision(0) << x << endl; // 1235 (arrotondato)Per la notazione scientifica (es. per numeri molto grandi o piccoli):
double grande = 1234567.89;cout << scientific << setprecision(3) << grande << endl; // 1.235e+06Larghezza minima: setw
Sezione intitolata “Larghezza minima: setw”setw(n) riserva almeno n posizioni per il prossimo valore. Se il valore è più corto, aggiunge spazi (a sinistra per l’allineamento predefinito):
cout << setw(10) << "Nome" << setw(10) << "Età" << endl;cout << setw(10) << "Alice" << setw(10) << 16 << endl;cout << setw(10) << "Bob" << setw(10) << 17 << endl;Output:
Nome Età Alice 16 Bob 17Attenzione: setw è temporaneo. Vale solo per il prossimo valore stampato, poi va reimpostato.
Allineamento: left e right
Sezione intitolata “Allineamento: left e right”Di default i valori vengono allineati a destra. Puoi cambiarlo con left:
cout << left << setw(10) << "Alice" << endl; // Alicecout << right << setw(10) << "Alice" << endl; // AliceOutput:
Alice Aliceleft e right sono persistenti: rimangono attivi finché non li cambi.
Carattere di riempimento: setfill
Sezione intitolata “Carattere di riempimento: setfill”Di default setw riempie con spazi. Puoi usare un altro carattere:
cout << setfill('*') << setw(10) << "ciao" << endl; // ******ciaocout << setfill('0') << setw(5) << 42 << endl; // 00042Utile per creare separatori o codici con zeri iniziali.
Stampare bool come parole
Sezione intitolata “Stampare bool come parole”Di default true e false vengono stampati come 1 e 0. Con boolalpha vengono stampate le parole:
bool b = true;cout << b << endl; // 1cout << boolalpha << b << endl; // true
bool f = false;cout << boolalpha << f << endl; // falseRiepilogo: persistente vs temporaneo
Sezione intitolata “Riepilogo: persistente vs temporaneo”| Modificatore | Dura fino a… |
|---|---|
fixed, scientific |
Finché non lo cambi |
left, right |
Finché non lo cambi |
boolalpha |
Finché non lo cambi |
setprecision(n) |
Finché non lo cambi |
setfill(c) |
Finché non lo cambi |
setw(n) |
Solo il prossimo valore |
Esempio pratico: tabella formattata
Sezione intitolata “Esempio pratico: tabella formattata”#include <iostream>#include <iomanip>#include <string>using namespace std;
int main() { // Intestazione della tabella cout << left << setw(15) << "Studente" << setw(8) << "Età" << setw(10) << "Voto" << endl;
// Riga separatrice cout << setfill('-') << setw(33) << "" << endl; cout << setfill(' '); // ripristina il riempimento con spazio
// Dati degli studenti struct Studente { string nome; int eta; double voto; }; Studente studenti[] = { {"Alice", 16, 8.5}, {"Bob", 17, 7.2}, {"Carlo Verdi", 15, 9.1} };
for (const auto& s : studenti) { cout << left << setw(15) << s.nome << setw(8) << s.eta << fixed << setprecision(1) << setw(10) << s.voto << endl; }
return 0;}Output:
Studente Età Voto---------------------------------Alice 16 8.5Bob 17 7.2Carlo Verdi 15 9.1