Spec-Zone.ru › C++

std::ios_base::width

streamsize width() const;
(1)
streamsize width( streamsize new_width );
(2)

Управляет минимальным количеством символов, создаваемых при некоторых операциях вывода, и максимальным количеством символов, считываемых при некоторых операциях ввода.

1) Возвращает текущую ширину поля.
2) Задаёт ширину поля. Возвращает предыдущую ширину поля.

Параметры

new_width - новое значение ширины поля

Возвращаемое значение

Ширина поля до вызова функции.

Примечания

Некоторые функции ввода-вывода вызывают width(0) перед возвратом; см. std::setw (в результате это поле влияет только на следующую функцию ввода-вывода, но не на последующие операции ввода-вывода).

Точное влияние этого модификатора на ввод и вывод зависит от конкретной функции ввода-вывода и отдельно описано на странице каждой перегрузки operator<< и operator>>.

Пример

#include <algorithm>
#include <array>
#include <iomanip>
#include <iostream>
#include <span>
#include <string_view>
using namespace std::string_view_literals;

constexpr std::array table_header =
{
    "Language"sv, "Author"sv, "Birthdate"sv, "RIP date"sv
};

using row_t = std::array<std::string_view, table_header.size()>;
using widths_t = std::array<std::size_t, table_header.size()>;

constexpr std::array table_body = std::to_array<row_t>
({
    {"C", "Dennis Ritchie", "1941-09-09", "2011-10-12"},
    {"C++", "Bjarne Stroustrup", "1950-12-30"},
    {"C#", "Anders Hejlsberg", "1960-12-02"},
    {"Python", "Guido van Rossum", "1956-01-31"},
    {"Javascript", "Brendan Eich", "1961-07-04"}
});

constexpr widths_t calculate_column_widths(std::span<const row_t> table)
{
    widths_t widths{};
    for (const row_t& row : table)
        for (size_t i = 0; i != row.size(); ++i)
            widths[i] = std::max(widths[i], row[i].size());
    return widths;
}

void print_row(const row_t& row, const widths_t& widths)
{
    std::cout << '|';
    for (size_t i = 0; i != row.size(); ++i)
    {
        std::cout << ' ';
        std::cout.width(widths[i]);
        std::cout << row[i] << " |";
    }
    std::cout << '\n';
};

void print_break(const widths_t& widths)
{
    const std::size_t margin = 1;
    std::cout.put('+').fill('-');
    for (std::size_t w : widths)
    {
        std::cout.width(w + margin * 2);
        std::cout << '-' << '+';
    }
    std::cout.put('\n').fill(' ');
};

int main()
{
    constexpr widths_t widths = calculate_column_widths(table_body);
 
    std::cout.setf(std::ios::left, std::ios::adjustfield);
    print_break(widths);
    print_row(table_header, widths);
    print_break(widths);
    for (const row_t& row : table_body)
        print_row(row, widths);
    print_break(widths);
}

Вывод:

+------------+-------------------+------------+------------+
| Language   | Author            | Birthdate  | RIP date   |
+------------+-------------------+------------+------------+
| C          | Dennis Ritchie    | 1941-09-09 | 2011-10-12 |
| C++        | Bjarne Stroustrup | 1950-12-30 |            |
| C#         | Anders Hejlsberg  | 1960-12-02 |            |
| Python     | Guido van Rossum  | 1956-01-31 |            |
| Javascript | Brendan Eich      | 1961-07-04 |            |
+------------+-------------------+------------+------------+

См. также

precision
управляет десятичной точностью операций с числами с плавающей точкой
(открытая функция-член)
setw
изменяет ширину следующего поля ввода-вывода
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/ios_base/width

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API