如何使用 iomanip 的设置、设置填充和左/右?设置填充不会停止其输出

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

本文关键字:设置 填充 输出 iomanip 何使用      更新时间:2023-10-16

我想让我的输出看起来像这样:

size       time1       time2
-------------------------------
10         4           8
100        48          16
1000       2937        922
10000      123011      3902
100000     22407380    830722

我知道我需要使用setw(), setfill()left。然而,我的尝试总是给我不正确的输出。下面是我的代码的一个例子:

std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2n";
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";
}

输出如下:

size    time1    time2
------------------------------------------------------------
103-------------------13------------------
100171-----------------199-----------------
100013183---------------667-----------------
10000670130--------------8205----------------
10000014030798-------------1403079888---------

我试过改变我使用setw(), setfill()left的顺序,但我现在只是盲目飞行。我还搜索了iomanip教程。就我所知,我是按照说明来的,但我还是不明白。

如何阻止setfill()跑过?我如何证明左,但使用setw()来阻止数字相互碰撞?

如何:

std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2n";
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的回答很好,只是标题不太一致。为了解决这个问题,我以"left"answers"setw"开始标题行,我还必须以"endl"而不是"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;
  }

在c++ 20中,您将能够使用std::format来做到这一点:

  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;
  } 
输出:

size                time                time2               
------------------------------------------------------------
10                  4                   8                   
100                 48                  16                  
1000                2937                922                 
10000               123011              3902                
100000              22407380            830722              
在此期间,您可以使用{fmt}库,std::format是基于。{fmt}还提供了print函数,使这更容易和更有效(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;
  }

免责声明:我是{fmt}和c++ 20 std::format的作者。