【发布时间】:2011-09-14 19:53:57
【问题描述】:
使用cout 时,<iomanip> 标头中定义的默认格式化程序是什么?换句话说,一旦我使用cout << fixed << setPrecision(2) 将我的格式化程序设置为fixed,我该如何将它改回来?或者,我要把它改回 到 什么?
【问题讨论】:
标签: c++ cout formatter iomanip
使用cout 时,<iomanip> 标头中定义的默认格式化程序是什么?换句话说,一旦我使用cout << fixed << setPrecision(2) 将我的格式化程序设置为fixed,我该如何将它改回来?或者,我要把它改回 到 什么?
【问题讨论】:
标签: c++ cout formatter iomanip
答案是 C++11 中的std::defaultfloat。要在 C++03 中实现这一点,您可以这样做
cout.unsetf(std::ios_base::floatfield);
【讨论】:
cout.unsetf(std::ios_base::floatfield); 这适用于 C++11 但不适用于 std::defaultfloat
cout.unsetf(std::ios_base::floatfield);为什么它只反转fixed的效果,因为它不包含像fixed这样的任何关键字,这意味着它为什么不重置precision也
std::fixed 的反义词是std::scientific。
(您可以在 this great answer 中找到一份不错的操纵器列表。)
【讨论】:
您可以使用resetiosflags() 取消设置任何标志。
【讨论】:
std::ios::scientific。
iword 和 pword。 (当然,James 完全意识到了这些限制。)但是,您可以使用 std::ios::flags()。
ostringstream,然后将已经格式化的输出作为std::string 发送到cout 可能是有意义的。这样做可能成本更高(输出通常不是我花费大量时间优化或调查性能问题的地方,因为通常其他与硬件相关的问题超过任何性能下降)。
std::fixed 的反义词是std::scientific。这可能对你有用。
但是,如果你想恢复更多的标志,或者如果你需要previous状态,你可以使用更好的解决方案来代替默认:
std::resetiosflags 操纵器可让您将特定标志重置为其默认值;
两个ios::flags 函数让您可以保存和恢复格式标志的先前值。
【讨论】:
std::fixed 的反义词不是std::scientific。它更像是一种自动格式切换模式。