C++ може ли setw и setfill да допълват края на низ?

Има ли начин да накарате setw и setfill да поставят края на низ вместо предната част?

Имам ситуация, в която отпечатвам нещо подобно.

 CONSTANT TEXT variablesizeName1 .....:number1 

 CONSTANT TEXT varsizeName2 ..........:number2

Искам да добавя променлива сума от '.' в края на

"CONSTANT TEXT variablesizeName#", за да мога да накарам ":number#" да се нареди на екрана.

Забележка: Имам масив от "variablesizeName#", така че знам най-широкия случай.

Or

Трябва ли да го направя ръчно, като задам setw така

for( int x= 0; x < ARRAYSIZE; x++)
{
string temp = string("CONSTANT TEXT ")+variabletext[x];
cout <<  temp;
cout << setw(MAXWIDTH - temp.length) << setfill('.') <<":";
cout << Number<<"\n";
}

Предполагам, че това ще свърши работа, но се чувства някак тромаво.

Идеи?


person Dan    schedule 21.08.2012    source източник


Отговори (2)


Можете да използвате манипулатори std::left, std::right и std::internal, за да изберете къде да отиват символите за запълване.

За вашия конкретен случай нещо подобно може да свърши работа:

#include <iostream>
#include <iomanip>
#include <string>

const char* C_TEXT = "Constant text ";
const size_t MAXWIDTH = 10;

void print(const std::string& var_text, int num)
{
    std::cout << C_TEXT
              // align output to left, fill goes to right
              << std::left << std::setw(MAXWIDTH) << std::setfill('.')
              << var_text << ": " << num << '\n';
}

int main()
{
    print("1234567890", 42);
    print("12345", 101);
}

Изход:

Constant text 1234567890: 42
Constant text 12345.....: 101

РЕДАКТИРАНЕ: Както е споменато във връзката, std::internal работи само с цяло число, плаваща запетая и паричен изход. Например с отрицателни цели числа, той ще вмъкне знаци за запълване между отрицателния знак и най-лявата цифра.

Това:

int32_t i = -1;
std::cout << std::internal
          << std::setfill('0')
          << std::setw(11)  // max 10 digits + negative sign
          << i << '\n';
i = -123;
std::cout << std::internal
          << std::setfill('0')
          << std::setw(11)
          << i;

ще изведе

-0000000001
-0000000123
person jrok    schedule 21.08.2012
comment
страхотно Като продължение на вашия отговор, как работи std::internal? - person Dan; 23.08.2012

Нещо като:

cout << left << setw(MAXWIDTH) << setfill('.') << temp << ':' << Number << endl;

Произвежда нещо като:

derp..........................:234
herpderpborp..................:12345678
person Wug    schedule 21.08.2012