std::setw în C++

Formatare C++98

Stabilește lățimea minimă a următoarei valori, cu aliniere și caracter de umplere.

Sintaxă
#include <iomanip>
std::cout << std::setw(latime) << valoare;
std::cout << std::setfill(caracter);
std::cout << std::left;   // sau std::right

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ă setw rămâne activ pentru toate valorile următoare. Se aplică doar următoarei valori; restul ai de repetat setw înaintea fiecărei coloane.
  • Aliniezi texte cu diacritice și coloanele ies strâmb: setw numără octeți. Folosește std::format("{:<10}", text).
  • Uiți că setfill('0') rămâne activ și toate numerele următoare cu setw primesc 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 <<.