2013-08-29 2 views
1

Я знаю, что basefield является маской для dec/oct/hex. Все, что я хочу, это отменить их с помощью функции потока setf, но независимо от того, насколько я пытаюсь это неправильно, поэтому я написал следующий пример, чтобы помочь мне понять, как флаги внутренне ищут все возможные значения basefield.set basefield to zero

#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; 
} 

г ++ 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 

Хед-флаги, кажется, точны, когда все основания не установлены.

Все, что я хочу, это установить флаги в значение, отличное от dec\oct\hex, поэтому, когда я реализую свой собственный манипулятор, я могу определить, какой формат используется в моих форматах или форматах потоков.

Спасибо.

+0

Это не способ создания собственных манипуляторов. –

+0

Я хочу создать манипулятор 'bin', есть ли лучший способ сделать это? –

+1

Нет, это невозможно. Вам нужно будет создать новый манипулятор. Возможно, вы должны задать новый вопрос. –

ответ

1

Вы не можете отключить флаги с перегрузкой setf с единственным параметром - он может устанавливать только новые флаги. Используйте unsetf или setf с двумя параметрами для отмены флажков.