Я подозреваю, что ваше понимание std::setw
просто неверно. Я думаю, вам нужно что-то большее, что-то вроде комбинации:
Что происходит в вашем коде:
- Использует
std::setw(5)
для установки ширины поля в пять символов.
- Отправляет
"first"
в поток длиной пять символов, поэтому установленная ширина поля полностью используется. Никакого дополнительного заполнения не происходит.
- Отправляет
"second"
в поток длиной шесть символов, так что опять же, вся ширина поля используется (и фактически нарушается). Опять же, заполнение не происходит
Если вы хотите иметь что-то вроде этого (с номерами столбцов выше, чтобы показать позиции):
col: 0123456789012345678901234567890123456789
first second third fourth
Обратите внимание, что каждое слово начинается на границе, кратной 10. Один из способов сделать это — использовать:
- Выходная позиция
std::left
(поэтому заливка, если таковая имеется, идет справа для достижения желаемой ширины). Это значение по умолчанию для строк, но никогда не помешает убедиться.
- Заполняющий символ
std::setfill(' ')
. Опять же по умолчанию.
- Ширина поля
std::setw(10)
Почему такое большое число? Смотри ниже
Пример
#include <iostream>
#include <iomanip>
int main ()
{
std::cout << std::left << std::setfill(' ')
<< std::setw(10) << "first"
<< std::setw(10) << "second"
<< std::setw(10) << "third"
<< std::setw(10) << "fourth" << '\n';
return 0;
}
Вывод (добавлены номера столбцов)
0123456789012345678901234567890123456789
first second third fourth
Итак, что произойдет, если мы изменим выходное местоположение на std::right
? Ну, с той же программой, изменив только первую строку на:
std::cout << std::right << std::setfill(' ')
мы получили
0123456789012345678901234567890123456789
first second third fourth
Наконец, один конструктивный способ увидеть, где применяются символы-заполнители, — это просто изменить символ-заполнитель на что-то видимое (т. е. на что-то кроме пробела). В последних двух примерах вывод, изменение заполняющего символа на std::setfill('*')
приводит к следующему выводу:
Первый
first*****second****third*****fourth****
Второй
*****first****second*****third****fourth
Обратите внимание, что в обоих случаях, поскольку ни один из отдельных элементов вывода не нарушил значение std::setw
, общий размер строки вывода для каждого из них одинаков. Все, что изменилось, это то, где были применены заливки и выровнены выходные данные в соответствии со спецификацией std::setw
.
person
WhozCraig
schedule
15.02.2017
"second"
– шесть символов). Обратите внимание, что...<< setw(5) << 123456 <<...
тоже не работает. - person Some programmer dude   schedule 15.02.2017first
иsecond
, почему он должен бытьsix chars long
, так что дело не в пространстве. - person AwaitedOne   schedule 15.02.2017first
иsecond
. - person AwaitedOne   schedule 15.02.2017\t
или\t\t
или\t\t\t
. - person Agaz Wani   schedule 15.02.20172
явно меньше 5, тогда какsecond
не - person phuclv   schedule 15.02.2017