将basefield设置为零

set basefield to zero

本文关键字:设置 basefield      更新时间:2023-10-16

我知道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

当取消设置时,所有的基本标志值都被设置为与十六进制标志相同,所以我运行代码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

十六进制标志似乎在所有基数都未设置的情况下是精确的。

我只想将标志设置为decocthex以外的值,这样当我实现自己的操纵器时,我就可以检测哪种格式正在使用我的格式或流格式。

谢谢。

不能用单个参数取消设置setf重载的标志,只能设置新的标志。使用带有两个参数的unsetfsetf来取消设置标志。