在 C++ 中重置输出标志

Resetting output flags in C++

我打算在我结束使用 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;
}

我已知的替代方法是通过重述它们来单独取消标记,但这似乎是多余的。

/*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.