установить базовое поле на ноль

я знаю это basefield это маска для dec/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

Шестнадцатеричные флаги кажутся точными, если все базы не установлены.

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

Благодарю.

1

Решение

Вы не можете сбросить флаги с setf перегрузка с одним параметром — он может устанавливать только новые флаги. использование unsetf или же setf с двумя параметрами для сброса флагов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]