Макет таблицы с использованием std :: cout - PullRequest
12 голосов
/ 25 февраля 2009

Как мне отформатировать вывод в потоках C ++ для печати выровненных по левому краю таблиц фиксированной ширины? Что-то вроде

printf("%-14.3f%-14.3f\n", 12345.12345, 12345.12345);

poducing

12345.123     12345.123

Ответы [ 4 ]

17 голосов
/ 25 февраля 2009

Включите стандартный заголовок <iomanip> и сходите с ума. В частности, манипулятор setw устанавливает ширину вывода. setfill устанавливает символ заполнения.

15 голосов
/ 25 февраля 2009
std::cout << std::setiosflags(std::ios::fixed)
          << std::setprecision(3)
          << std::setw(18)
          << std::left
          << 12345.123;
11 голосов
/ 25 февраля 2009

Вы также можете рассмотреть более дружественную функциональность, предоставляемую одним из них:

  • Boost.Format (мощный, но очень тяжелый, требует больше времени и памяти, чем другие упомянутые)
  • Loki.SafeFormat
  • FastFormat (относительно новая, но невероятно быстрая библиотека, также в отличие от других, безопасная для типов)

Запись по памяти, но должно быть что-то вроде этого:

// Dumb streams:
printf("%-14.3f%-14.3f\n", 12345.12345, 12345.12345);

// For IOStreams you've got example in the other answers

// Boost Format supports various flavours of formatting, for example:
std::cout << boost::format("%-14.3f%-14.3f\n") % a % b;
std::cout << boost::format("%1$-14.3f%2$-14.3f\n") % a % b;
// To gain somewhat on the performance you can store the formatters:
const boost::format foo("%1$-14.3f%2$-14.3f\n");
std::cout << boost::format(foo) % a % b;

// For the Loki::Printf it's also similar:
Loki::Printf("%-14.3f%-14.3f\n")(a)(b);

// And finally FastFormat.Format (don't know the syntax for decimal places)
fastformat::fmtln(std::cout, "{0,14,,<}{1,14,,>}", a, b);

Кроме того, если вы планируете придерживаться любой из этих библиотек форматирования, тщательно изучите их ограничения в контексте выразимости, переносимости (и других зависимостей библиотеки), эффективности, поддержки интернационализации, безопасности типов и т. Д.

5 голосов
/ 25 февраля 2009

Вы хотите использовать потоковые манипуляторы:

http://www.deitel.com/articles/cplusplus_tutorials/20060218/index.html

...