I'm trying to get my output to look like this:
size time1 time2
-------------------------------
10 4 8
100 48 16
1000 2937 922
10000 123011 3902
100000 22407380 830722
And I know I need to use setw()
, setfill()
, and left
. However, my attempts keep giving me incorrect output. Here is one example of my code:
std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2\n";
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
for(int i = 0; i < 5; i++) {
std::cout << run;
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << "\n";
}
And here's the output:
size time1 time2
------------------------------------------------------------
103-------------------13------------------
100171-----------------199-----------------
100013183---------------667-----------------
10000670130--------------8205----------------
10000014030798-------------1403079888---------
I've tried changing the order that I'm using setw()
, setfill()
, and left
, but I'm just flying blind right now. I've also searched iomanip tutorials. I'm following the directions--as far as I can tell--but I'm still not getting it.
How do I stop the setfill()
from running over? How do I justify left but use setw()
to stop the numbers from running into each other?
How about:
std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2\n";
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
std::cout << std::setfill(' '); //fill with spaces
for(int i = 0; i < 5; i++) {
std::cout << std::setw(20) << std::left << run; // fill the run column
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << "\n";
}
sj0h's answer is great except the titles don't quite line up. To fix it I started the title line with "left" and "setw", I also had to end with "endl" instead of "\\n".
std::cout << std::left << std::setw(20) << "size" << std::setw(20) << "time" << std::setw(20) << "time2" << std::endl;
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
std::cout << std::setfill(' '); //fill with spaces
for(int i = 0; i < 10; i++) {
std::cout << std::setw(20) << std::left << run; // fill the run column
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << std::endl;
}
In C++20 you'll be able to use std::format
to do this:
std::cout << std::format("{:20}{:20}{:20}\n", "size", "time", "time2");
std::cout << std::format("{:-<60}\n", "");
int run = 10;
for(int i = 0; i < 5; i++) {
std::cout << std::format("{:<20}{:<20}{:<20}\n", run, time[i], time2[i]);
run *= 10;
}
Output:
size time time2
------------------------------------------------------------
10 4 8
100 48 16
1000 2937 922
10000 123011 3902
100000 22407380 830722
In the meantime you can use the {fmt} library , std::format
is based on. {fmt} also provides the print
function that makes this even easier and more efficient ( godbolt ):
fmt::print("{:20}{:20}{:20}\n", "size", "time", "time2");
fmt::print("{:-<60}\n", "");
int run = 10;
for(int i = 0; i < 5; i++) {
fmt::print("{:<20}{:<20}{:<20}\n", run, time[i], time2[i]);
run *= 10;
}
Disclaimer : I'm the author of {fmt} and C++20 std::format
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.