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 | | +------------+-------------------+------------+------------+
См. также
| управляет десятичной точностью операций с числами с плавающей точкой (открытая функция-член) |
|
| изменяет ширину следующего поля ввода-вывода (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/ios_base/width