19

Is there a way to make setw and setfill pad the end of a string instead of the front?

I have a situation where I'm printing something like this.

 CONSTANT TEXT variablesizeName1 .....:number1 CONSTANT TEXT varsizeName2 ..........:number2 

I want to add a variable amount of '.' to the end of

"CONSTANT TEXT variablesizeName#" so I can make ":number#" line up on the screen.

Note: I have an array of "variablesizeName#" so I know the widest case.

Or

Should I do it manually by setting setw like this

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"; } 

I guess this would do the job but it feels kind of clunky.

Ideas?

0

3 Answers 3

34

You can use manipulators std::left, std::right, and std::internal to choose where the fill characters go.

For your specific case, something like this could do:

#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); } 

Output:

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

EDIT: As mentioned in the link, std::internal works only with integer, floating point and monetary output. For example with negative integers, it'll insert fill characters between negative sign and left-most digit.

This:

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; 

will output

-0000000001 -0000000123 
Sign up to request clarification or add additional context in comments.

1 Comment

Awesome. As a follow up to your answer, how does std::internal work?
1

Something like:

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

Produces something like:

derp..........................:234 herpderpborp..................:12345678 

Comments

0
#include <iostream> #include <iomanip> int main() { std::cout << std::setiosflags(std::ios::left) // left align this section << std::setw(30) // within a max of 30 characters << std::setfill('.') // fill with . << "Hello World!" << "\n"; } //Output: Hello World!.................. 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.