How do I use iomanip's setw, setfill, and left/right? Setfill isn't stopping its output

41,040

Solution 1

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

Solution 2

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;
  }
Share:
41,040
user3448821
Author by

user3448821

Updated on March 03, 2021

Comments

  • user3448821
    user3448821 about 3 years

    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?