Как использовать настройки iomanip setw, setfill и left/right? Setfill не останавливает свой вывод

Я пытаюсь, чтобы мой вывод выглядел так:

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

И вот результат:

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

Я пытался изменить порядок, в котором я использую setw(), setfill() и left, но сейчас я просто летаю вслепую. Я также искал учебники по iomanip. Я следую указаниям, насколько я могу судить, но до сих пор не понимаю.

Как мне остановить setfill() от наезда? Как мне обосновать слева, но использовать setw(), чтобы числа не пересекались друг с другом?


person user3448821    schedule 26.03.2014    source источник


Ответы (3)


Как насчет:

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";
}
person sj0h    schedule 26.03.2014

Ответ sj0h великолепен, за исключением того, что названия не совсем совпадают. Чтобы исправить это, я начал строку заголовка с «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;
  }
person oneofthesixbillion    schedule 23.03.2018

В 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.

person vitaut    schedule 03.03.2021