【问题标题】:Reset properties of std::cout for integers or doubles in C++为 C++ 中的整数或双精度数重置 std::cout 的属性
【发布时间】:2013-08-22 02:02:49
【问题描述】:

在我的代码中的不同位置,我设置了某些流属性,例如在std::cout << fixed << 4.56342; 中,以便控制integerdouble 在打印到标准输出时的显示方式。有时,在特定的运行时流程中,std::cout 的使用没有任何操作,但由于前面的操作而无意中转换了输出。

那么,重置std::cout 的所有此类属性的最佳方法是什么,以便对std::cout<< 的调用将与以下示例完全相同:

#include <iostream>

int main(int argc, char **argv) {
    // let X be an integer or a double
    std::cout << X;
    return 0;
}

我看到Effective use of C++ iomanip library,通常不直接使用操纵器是有意义的。这将是一个很好的战略。尽管如此,很高兴知道如何撤消我上面描述的所有此类操作。

【问题讨论】:

    标签: c++ cout iomanip


    【解决方案1】:

    使用resetiosflags:

    std::cout << std::resetiosflags( std::ios_base::basefield ); // clears integer manipulations
    std::cout << std::resetiosflags( std::ios_base::floatfield  ); // clears floating-point manipulations
    std::cout << std::resetiosflags( std::cout.flags() ); // clears all flags
    

    【讨论】:

    • cout 也可以设置precision 和/或width。 (虽然大多数使用width 的东西后来也会重置它。)
    • @aschepler 那么cout.unsetf() 会重置std::setprecision(3) 之类的东西吗?
    • @aschepler 但是为了解决这个问题,我推测您需要在初始设置之前保存精度值,并在完成后将其重置。
    • @synaptik 它不会。请参阅我上面写的评论。
    • @templateboy 谢谢。我尝试了错误的函数,但它不起作用,但我从来没有在这里提到这一点,因为我决定停止操作 cout,而是编写操作本地字符串流的函数,然后将其作为字符串返回并传递给 cout。但是,就像我说的,我确实想知道如何重置 cout,所以感谢您更新您的解决方案。
    猜你喜欢
    • 2020-10-13
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2017-10-26
    相关资源
    最近更新 更多