12

如何在 C++ 流中格式化我的输出以打印固定宽度的左对齐表格?就像是

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

生产

12345.123     12345.123
4

4 回答 4

17

包括标准标题<iomanip>并发疯。具体来说,setw操纵器设置输出宽度。setfill设置填充字符。

于 2009-02-25T15:24:39.637 回答
15
std::cout << std::setiosflags(std::ios::fixed)
          << std::setprecision(3)
          << std::setw(18)
          << std::left
          << 12345.123;
于 2009-02-25T15:23:37.033 回答
11

您还可以考虑以下之一提供的更友好的功能:

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

此外,如果您打算坚持使用这些格式库中的任何一个,请彻底检查它们在可表达性、可移植性(和其他库依赖性)、效率、国际化支持、类型安全等方面的局限性。

于 2009-02-25T15:26:04.283 回答
5

您想使用流操纵器:

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

于 2009-02-25T15:25:02.477 回答