【问题标题】:What's the opposite of `fixed` in cout?cout中“固定”的反义词是什么?
【发布时间】:2011-09-14 19:53:57
【问题描述】:

使用cout 时,<iomanip> 标头中定义的默认格式化程序是什么?换句话说,一旦我使用cout << fixed << setPrecision(2) 将我的格式化程序设置为fixed,我该如何将它改回来?或者,我要把它改回 什么?

【问题讨论】:

    标签: c++ cout formatter iomanip


    【解决方案1】:

    答案是 C++11 中的std::defaultfloat。要在 C++03 中实现这一点,您可以这样做

    cout.unsetf(std::ios_base::floatfield);

    Really, what's the opposite of "fixed" I/O manipulator?

    【讨论】:

    • cout.unsetf(std::ios_base::floatfield); 这适用于 C++11 但不适用于 std::defaultfloat
    • 还有cout.unsetf(std::ios_base::floatfield);为什么它只反转fixed的效果,因为它不包含像fixed这样的任何关键字,这意味着它为什么不重置precision
    【解决方案2】:

    std::fixed 的反义词是std::scientific

    (您可以在 this great answer 中找到一份不错的操纵器列表。)

    【讨论】:

    • 默认浮点数和科学计数法不同。这并不完全是“改回来”。
    【解决方案3】:

    您可以使用resetiosflags() 取消设置任何标志。

    【讨论】:

    • 我可以设置一个“默认值”吗?
    • 我相信默认是std::ios::scientific
    • @Moshe:不幸的是,没有简单的方法可以完全重置流。即使是我见过的最复杂的代码(十多年前由 James Kanze 编写)也遗漏了一些深奥的属性,例如 iwordpword。 (当然,James 完全意识到了这些限制。)但是,您可以使用 std::ios::flags()
    • 重置流的最简单方法是默认构造它。在某些情况下,将您的输出格式化为ostringstream,然后将已经格式化的输出作为std::string 发送到cout 可能是有意义的。这样做可能成本更高(输出通常不是我花费大量时间优化或调查性能问题的地方,因为通常其他与硬件相关的问题超过任何性能下降)。
    【解决方案4】:

    std::fixed 的反义词是std::scientific。这可能对你有用。

    但是,如果你想恢复更多的标志,或者如果你需要previous状态,你可以使用更好的解决方案来代替默认:

    1. std::resetiosflags 操纵器可让您将特定标志重置为其默认值;

    2. 两个ios::flags 函数让您可以保存和恢复格式标志的先前值。

    【讨论】:

    • 嗯,在“回到默认”的意义上,std::fixed 的反义词不是std::scientific。它更像是一种自动格式切换模式。
    猜你喜欢
    • 2011-01-04
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多