2015-05-28 3 views
0

Выражаясь простоC++ сохранение возвращаемого значения функции члена SETF()

#include <iostream> 

using namespace std ; 

int main() 
{ 
    ios_base::fmtflags initial ; 

    cout << 10 << ' ' << 15.0 << '\n' ; 
    initial = cout.setf(ios_base::fixed); 
    cout << 10 << ' ' << 15.0 << '\n' ; 
    cout.setf(initial); 
    cout << 10 << ' ' << 15.0 << '\n' ; 

    return 0; 
} 

Этот код должен произвести следующий вывод:

10 15 
10 15.000000 
10 15 

Но это не так. Что он производит это:

10 15 
10 15.000000 
10 15.000000 

Таким образом, очевидно призыв к SEtF с начальной в качестве аргумента не работает правильно.

В чем проблема?

ответ

5

setf установит флаги, но не очистить их. Таким образом, setf(ios_base::fixed) установит флаг «fixed», но setf(initial) оставит его установленным.

Используйте flags, чтобы назначить все флаги.

cout.flags(initial); 
+0

oh! могу ли я сделать вывод из ваших слов, что setf только превращает биты (on) и не может ничего сделать? – Lockon2000

+0

@ Lockon2000: Да, вот что я имел в виду. –

+0

хорошо, спасибо за вашу помощь. – Lockon2000

2

Биты от std::fixed все еще присутствуют в части маски std::ios_base::floatfield. Вы должны очистить эту маску первого затем набор initial:

std::cout.setf(initial, std::ios_base::floatfield); 
//      ^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Я ценю вашу помощь, и ваш метод тоже работал. Но первый способ намного проще и понятнее, я буду держать свой путь для более сложных вещей :) – Lockon2000

Смежные вопросы