将basefield设置为零

时间:2013-08-29 19:39:42

标签: c++ stl iomanip

我知道basefielddec/oct/hex的掩码,我想要的是使用setf流功能取消它们,但无论我尝试多少都不对,所以我写了以下示例帮助我了解标志内部如何查找basefield的所有可能值。

#include <iostream>
using namespace std;

int main()
{
    typedef ios_base::fmtflags fmt;
    fmt a, b, c = cout.basefield;

    cout << "basefield: " << hex << c << endl;

    cout << dec;
    a = cout.flags();
    b = a & c;
    cout << "\ndec flags:\n";
    cout << "   a: " << hex << a << endl;
    cout << "   b: " << hex << b << endl;

    cout << oct;
    a = cout.flags();
    b = a & c;
    cout << "\noct flags:\n";
    cout << "   a: " << hex << a << endl;
    cout << "   b: " << hex << b << endl;

    cout << hex;
    a = cout.flags();
    b = a & c;
    cout << "\nhex flags:\n";
    cout << "   a: " << hex << a << endl;
    cout << "   b: " << hex << b << endl;

    cout.setf(cout.flags() & ~cout.basefield);
    a = cout.flags();
    b = a & c;
    cout << "\nunset basefiled:\n";
    cout << "   a: " << hex << a << endl;
    cout << "   b: " << hex << b << endl;
}

g ++ 4.8.1结果是:

basefield: 4a

dec flags:
   a: 1002
   b: 2

oct flags:
   a: 1040
   b: 40

hex flags:
   a: 1008
   b: 8

unset basefiled:
   a: 1008
   b: 8

当取消设置所有base标志值设置为与hex标志相同时,所以我运行代码Visual C ++ 2008和Intel C ++ XE,结果是:

basefield: e00

dec flags:
   a: 201
   b: 200

oct flags:
   a: 401
   b: 400

hex flags:
   a: 801
   b: 800

unset basefiled:
   a: 801
   b: 800

Hex标志似乎与所有基础未设置完全相同。

我想要的只是将标志设置为dec\oct\hex以外的值,所以当我实现自己的操纵器时,我可以检测出哪种格式正在使用我的格式或流格式。

感谢。

1 个答案:

答案 0 :(得分:1)

您不能使用单个参数取消设置setf重载的标志 - 它只能设置新标志。使用unsetfsetf两个参数来取消设置标记。