在C ++中重置输出标志

时间:2015-01-31 23:02:08

标签: c++ iostream flags iomanip

我打算在我使用resetiosflags函数结束的行上将所有输出标志重置为默认值。当我尝试以这种方式进行时,它会提供错误的输出,这与我的期望相反。

#include <iostream>
#include <iomanip>
using namespace std;
int
main()
{
    bool first;
    int second;
    long third;
    float fourth;
    float fifth;
    double sixth;

    cout << "Enter bool, int, long, float, float, and double values: ";
    cin >> first >> second >> third >> fourth >> fifth >> sixth;
    cout << endl;

// ***** Solution starts here ****
    cout << first << " " << boolalpha << first  << endl << resetiosflags;
    cout << second << " " << showbase << hex << second << " " << oct << second << endl << resetiosflags;
    cout << third << endl;
    cout << showpos << setprecision(4) << showpoint << right << fourth << endl << resetiosflags;
    cout << scientific << fourth << endl << resetiosflags;
    cout << setprecision(7) << left << fifth << endl << resetiosflags;
    cout << fixed << setprecision(3) << fifth << endl << resetiosflags;
    cout << third << endl;
    cout << fixed << setprecision(2) << fourth << endl << resetiosflags;
    cout << fixed << setprecision(0) << sixth << endl << resetiosflags;
    cout << fixed << setprecision(8) << fourth << endl << resetiosflags;
    cout << setprecision(6) << sixth << endl << resetiosflags;
// ***** Solution ends here ****

    cin.get();
    return 0;
}

我已知的替代方案是通过重新标记它们来逐个标记它们,但这似乎是多余的。

1 个答案:

答案 0 :(得分:1)

/*unspecified*/ resetiosflags( std::ios_base::fmtflags mask );

std::resetiosflags()是一个旨在用于out << resetiosfloags( flags )等表达式的操纵器。大概你正在做的是传入一个函数指针,它由std::operator<<的重载选择,它接受一个布尔值并打印1。

std::resetiosflags()将格式标志作为无法操纵精度的参数。但是std::ios_base::boolalpha可以:

std::cout << ... << std::resetiosflags(std::ios_base::boolalpha);

还有std::noboolalpha

std::cout << ... << std::noboolalpha;

但是如果你需要将精度重置为默认值,你可以为此创建自己的操纵器。您也可以使用Boost IO State Saver