Ce face std::setw
std::setw(n) cere ca următoarea valoare scrisă să ocupe cel puțin n caractere. Dacă e mai scurtă, se completează cu spații (sau cu caracterul dat de std::setfill). Dacă e mai lungă, nu este tăiată.
std::right (implicit) pune completarea în stânga, deci aliniază valoarea la dreapta; std::left aliniază la stânga. std::setfill('0') schimbă caracterul de umplere. Spre deosebire de setw, care se aplică o singură dată, left, right și setfill rămân active până le schimbi.
setw numără octeți, nu litere. Un cuvânt cu diacritice (de exemplu Iași, 4 litere, 5 octeți în UTF-8) primește un spațiu mai puțin și strică alinierea. std::format și std::println nu au această problemă.
Parametri
| Parametru | Descriere |
|---|---|
latime |
Lățimea minimă, în caractere (octeți), a următoarei valori. |
caracter |
Pentru setfill: caracterul folosit la completare. |
Exemple
Exemplul 1: Tabel aliniat
#include <iomanip>
#include <iostream>
int main() {
std::cout << std::left << std::setw(10) << "Produs" << std::right << std::setw(8) << "Stoc" << '\n';
std::cout << std::left << std::setw(10) << "Caiet" << std::right << std::setw(8) << 12 << '\n';
std::cout << std::left << std::setw(10) << "Pix" << std::right << std::setw(8) << 150 << '\n';
std::cout << std::left << std::setw(10) << "Rucsac" << std::right << std::setw(8) << 3 << '\n';
}
Rezultat
Produs Stoc
Caiet 12
Pix 150
Rucsac 3
Exemplul 2: Numere completate cu zerouri
setfill rămâne activ, de aceea îl punem înapoi pe spațiu la final.
#include <iomanip>
#include <iostream>
int main() {
for (int nr : {7, 42, 1024}) {
std::cout << "Factura nr. " << std::setfill('0') << std::setw(5) << nr << '\n';
}
std::cout << std::setfill(' ');
std::cout << '[' << std::setw(5) << 7 << "]\n";
}
Rezultat
Factura nr. 00007
Factura nr. 00042
Factura nr. 01024
[ 7]
Exemplul 3: setw se aplică doar următoarei valori și numără octeți
Al doilea număr nu mai are lățime. Iar „Iași” are 5 octeți, deci primește doar un spațiu și iese decalat față de „Cluj”.
#include <iomanip>
#include <iostream>
int main() {
std::cout << '[' << std::setw(4) << 1 << "][" << 2 << "]\n";
std::cout << std::left;
std::cout << '[' << std::setw(6) << "Cluj" << "]\n";
std::cout << '[' << std::setw(6) << "Iași" << "]\n";
}
Rezultat
[ 1][2]
[Cluj ]
[Iași ]
Greșeli frecvente
- Crezi că
setwrămâne activ pentru toate valorile următoare. Se aplică doar următoarei valori; restul ai de repetatsetwînaintea fiecărei coloane. - Aliniezi texte cu diacritice și coloanele ies strâmb:
setwnumără octeți. Foloseștestd::format("{:<10}", text). - Uiți că
setfill('0')rămâne activ și toate numerele următoare cusetwprimesc zerouri în față.
Comenzi înrudite
std::setprecision: Controlează câte cifre sau zecimale au numerele reale afișate, cu fixed și scientific.std::format: Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).std::println: Afișează text formatat cu acolade {} și trece pe rândul următor (C++23).std::cout: Afișează text și valori în consolă, cu operatorul <<.