简体   繁体   English

如何使用 iomanip 的 setw、setfill 和 left/right? Setfill 不会停止输出

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

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 .而且我知道我需要使用setw()setfill()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.我已经尝试更改我使用setw()setfill()left的顺序,但我现在只是盲目飞行。 I've also searched iomanip tutorials.我还搜索了 iomanip 教程。 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?如何阻止setfill()溢出? How do I justify left but use setw() to stop the numbers from running into each other?我如何证明左对齐但使用setw()来阻止数字相互碰撞?

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. sj0h 的回答很好,只是标题不太一致。 To fix it I started the title line with "left" and "setw", I also had to end with "endl" instead of "\\n".为了修复它,我以“left”和“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;
  }

In C++20 you'll be able to use std::format to do this:在 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;
  } 

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} 库std::format基于。 {fmt} also provides the print function that makes this even easier and more efficient ( godbolt ): {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;
  }

Disclaimer : I'm the author of {fmt} and C++20 std::format .免责声明:我是 {fmt} 和 C++20 std::format

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM