Подтвердить что ты не робот

Раскладка таблицы с использованием std:: cout

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

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

poducing

12345.123     12345.123
4b9b3361

Ответ 1

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

Ответ 2

std::cout << std::setiosflags(std::ios::fixed)
          << std::setprecision(3)
          << std::setw(18)
          << std::left
          << 12345.123;

Ответ 3

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

  • 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 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);

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