Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > установки флагов формата


Автор: jurgal 1.8.2007, 16:19
небольшой отрывок функции:



Код

ios::fmtflags f;

f=cout.flags();

if(f & ios::skipws) cout << "skiws установлен\n";
else cout << "skipws сброшен\n";


присваиваем переменной f установки флагов формата, и теперь вопрос: оператор & сравнивает поразрядно операнды, но ведь в f все установки флагов, а сравниваем мы её только с skipws, как может получиться, что выражение (f & ios::skipws) даст нам истину?

Автор: Kuvaldis 1.8.2007, 16:40
jurgal, 
Цитата

ператор & сравнивает поразрядно операнды, но ведь в f все установки флагов, а сравниваем мы её только с skipws, как может получиться, что выражение (f & ios::skipws) даст нам истину?

Идет ПОРАЗРЯДНОЕ "и". В С/С++ любое (!) ненулевое значение - это истина
т.е. допустим, что 
flags    = 1111
skipws = 0010
после & получим:  0010 != 0   -> поэтому это истина

Автор: JackYF 1.8.2007, 18:02
Kuvaldis истину глаголит. Поэтому ставь "&&" место "&".

Автор: bsa 2.8.2007, 10:29
Цитата(JackYF @ 1.8.2007,  18:02)
Поэтому ставь "&&" место "&".

Проверка флагов осуществляется операцией побитной "И" (&), а не логической (&&)!!!

Автор: jurgal 2.8.2007, 14:03
снова вопрос по флагам =)

когда использую функцию setiosflags(), то толку от неё нет никакого, т.е. ни ошибок при компилировании , ни каких либо изменений флагов на выводе: 

Код

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << setiosflags(ios::hex);
    cout << setiosflags(ios::showbase);
    cout << 1100 << '\n';
    return 0;
}


результат получается: 1100, а когда меняю манипуляторы вот так:

Код

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << hex << showbase << 1100;

    return 0;
}


то все в порядке, получаю правильный результат. Где ошибка в использовании функции setiosflags()? 

Автор: bsa 2.8.2007, 15:07
Мне тоже интересно. Думаю, проблема из той же серии, что и:
Код
std::cout << std::ios_base::hex << 100 << std::endl;
выводящее 8100, а не 64

Автор: korbian 2.8.2007, 16:13
Делай так, и все ок
Код

std::cout << std::hex << 100 << std::endl;



Автор: jurgal 2.8.2007, 16:50
в том то и дело, что если использовать манипуляторы так:

cout << hex << showbase << 100 << endl; 

то все в порядке, т.е. 64 - результат, а функцией setiosflags() пользоваться не получается, т.е. она не форматирует вводимое число, а оставляет как есть в десятичной системе и без указания системы счисления: 100

Автор: _stranger_ 2.8.2007, 18:33
а так все в порядке

Код

         std::cout << std::resetiosflags(std::ios_base::dec);
         std::cout << std::setiosflags(std::ios_base::hex);
         std::cout << std::setiosflags(std::ios_base::showbase);
         std::cout << 1100 << '\n';

видимо необходимо отчищать флаги...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)