Я пытаюсь использовать заданную ширину setw
однако для вывода строки в выходной файл я не могу заставить его работать. У меня есть со мной следующий пример.
// setw example
#include <iostream>
#include <iomanip>
#include <fstream>
int main () {
std::ofstream output_file;
output_file.open("file.txt");
output_file << "first" <<std::setw(5)<< "second"<< std::endl;
output_file.close();
return 0;
}
Редактировать:
С учетом приведенных выше строк я ожидал, что между first
а также second
, что-то вроде
first second
Я почти не вижу пробелов, выход просто приходит как firstsecond
Я думаю, что я пропустил работу setw()
Замечания: Для целых чисел, это прекрасно работает просто:
output_file << 1 <<std::setw(5)<< 2 << std::endl;
Что я делаю не так ??
Я подозреваю ваше понимание std::setw
это просто не правильно. Я думаю, что вам нужно что-то еще в сочетании комбинации:
std::setw
для настройки ширины поляstd::setfill
для настройки символа заполненияstd::left
, std::right
, std::internal
для установки позиции записи в пределах указанной ширины поля.Что происходит в вашем коде:
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
Спецификация.
Других решений пока нет …