Как std :: setw работает со строковым выводом?

Я пытаюсь использовать заданную ширину 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;

Что я делаю не так ??

2

Решение

Я подозреваю ваше понимание 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 Спецификация.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]