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


Автор: S.A.G. 4.6.2007, 18:56
Для начала приведу цитату из Шилдта:
Цитата
Каждый поток ввода/вывода связан с набором флагов формата (format flags), которые управляют способом форматирования информации и представляют собой битовые маски (bitmasks). Эти маски объявлены в классе ios как данные перечислимого типа fmtflags.

Выходит значения перечислимого типа fmtflags и есть флаги. Однако если объявить переменную типа fmtflags, она в любой момент времени будет содержать только одно значение из всех возможных. В классе ios должно быть такое объявление:
Код
enum fmtflags {маски(флаги)};

Существует функция-член этого же класса setf:
Код
fmtflags setf(fmtflags флаги);

Она позволяет устанавливать флаги. Например, для установки флага showpos можно воспользоваться следующей инструкцией:
Код
поток_ввода/вывода.setf(ios::showpos);

Здесь showpos представляет собой значение перечислимого типа. В зависимости от порядка следования в объявлении типа fmtflags эта константа будет иметь определенное значение целого типа. Если это и есть флаг то в чем состоит его установка? Что значит "установить флаг"? Если бы флаги представляли собой переменные булевого типа то никаких проблем с их пониманием бы не возникло. Непонятна также роль оператора ::.

Автор: vinter 4.6.2007, 19:03
Цитата(S.A.G. @  4.6.2007,  19:56 Найти цитируемый пост)
 Непонятна роль оператора ::

уточнение области видимости
Цитата(S.A.G. @  4.6.2007,  19:56 Найти цитируемый пост)
 Флаги это переменные?

да
Цитата(S.A.G. @  4.6.2007,  19:56 Найти цитируемый пост)
Где они объявлены?


Цитата(S.A.G. @  4.6.2007,  19:56 Найти цитируемый пост)
Эти маски объявлены в классе ios как данные перечислимого типа fmtflags.


Автор: S.A.G. 4.6.2007, 19:15
Отредактировал изначальный вопрос.

vinter, ты сам себе противоречишь.

Флаги это переменные? -> да;
Где они объявлены? -> Эти маски объявлены в классе ios как данные перечислимого типа fmtflags;

Выходит константы а не переменные.

Автор: Rockie 4.6.2007, 19:42
Цитата(S.A.G. @  4.6.2007,  18:56 Найти цитируемый пост)
 Если это и есть флаг то в чем состоит его установка? Что значит "установить флаг"?


S.A.G., я так понимаю что если переменная равна 0, то она имеет вид, к примеру
00000000 00000000. Когда она равна 10, то 00000000 00001010, то есть "установлен" второй и четвертый по счету справа бит(флаг).

Добавлено через 1 минуту и 17 секунд
S.A.G., вот http://ru.wikipedia.org/wiki/IP
Цитата
3 бита флагов. Первый бит должен быть всегда равен нулю, второй бит DF (don’t fragment) определяет возможность фрагментации пакета и третий бит MF (more fragments) показывает, не является ли этот пакет последним в цепочке пакетов.



Автор: vinter 4.6.2007, 19:59
Цитата(S.A.G. @  4.6.2007,  20:15 Найти цитируемый пост)
vinter, ты сам себе противоречишь.

согласен, но я думаю ты понял что я имел ввиду smile 
для меня это одно и тоже, правда если константа, то это константная переменная, но все равно переменная

Автор: S.A.G. 4.6.2007, 20:57
Rockie, об установке битов я знаю. Я знаю что если бит равен 0 то он сброшен а если 1 то установлен..

Для меня тут непонятно другое. Если перечислимые константы тут и есть флаги то как они устанавливаються? Разве можно изменить значение константы? В функцию передается значение этой константы (флага). Что потом происходит с этим значением? В любом случае неважно как оно используется, используется значение!

Автор: bsa 4.6.2007, 21:05
блин. проще на примере:
Код
#include <fstream>
int main()
{
   std::ofstream file("filename.txt", std::ios_base::out | std::ios_base::app);
   file << "some text" << std::endl;
   return 0;
}
Таким образом, в конструктор класса std::ofstream передается помимо имени результат операции "ИЛИ" над двумя константами std::ios_base::out и std::ios_base::app. Причем ни одна из них не изменяется. Это аналогично:
Код
int a = 10 + 50;

Автор: Fazil6 4.6.2007, 21:14
Цитата(S.A.G. @  4.6.2007,  20:57 Найти цитируемый пост)
Если перечислимые константы тут и есть флаги то как они устанавливаються?

Значения флагов константы. При установке эти значения запоминаются в объекте. Что тут непонятного?

Автор: S.A.G. 4.6.2007, 21:20
Цитата(Fazil6 @ 4.6.2007,  21:14)
Цитата(S.A.G. @  4.6.2007,  20:57 Найти цитируемый пост)
Если перечислимые константы тут и есть флаги то как они устанавливаються?

Значения флагов константы. При установке эти значения запоминаются в объекте. Что тут непонятного?

Флаги это значения перечислимого типа fmtflags.

Как они устанавливаются?

bsa, что такое out и app?

Автор: Fazil6 4.6.2007, 21:23
Цитата(S.A.G. @  4.6.2007,  21:20 Найти цитируемый пост)

Флаги это значения перечислимого типа fmtflags.
Как они устанавливаются?

никак. Сами по себе они такого типа, а   внутри объекта они сохраняются в обычную переменную

Автор: bsa 4.6.2007, 21:26
Цитата(S.A.G. @ 4.6.2007,  21:20)
bsa, что такое out и app?

Детский сад.
Пример, как это сделано:
Код
namespace std {
namespace ios_base {

enum openmode
{
     out = 0x10,
     app = 0x04
....
};

....
}} //namespace std::ios_base

Автор: Fazil6 4.6.2007, 21:36
Цитата(S.A.G. @  4.6.2007,  21:20 Найти цитируемый пост)
bsa, что такое out и app?

это и есть флаги

Автор: S.A.G. 4.6.2007, 21:45
Цитата(bsa @ 4.6.2007,  21:26)
Цитата(S.A.G. @ 4.6.2007,  21:20)
bsa, что такое out и app?

Детский сад.
Пример, как это сделано:
Код
namespace std {
namespace ios_base {

enum openmode
{
     out = 0x10,
     app = 0x04
....
};

....
}} //namespace std::ios_base

Комментарии про детсад оставьте для ваших коллег по саду. smile

out и app это константы перечислимого типа, спасибо. :: тут используется для того чтобы можно было их использовать. . тут не прокатывает так как out и app не переменные. С :: ясно.

Добавлено через 9 минут и 28 секунд
Цитата(Fazil6)
никак. Сами по себе они такого типа, а   внутри объекта они сохраняются в обычную переменную

Сами флаги суть константы целого типа. В какую переменную сохраняются? Меня интересуют системные флаги формата а не отфонарные.

Автор: nickless 4.6.2007, 23:07
Цитата(S.A.G. @  4.6.2007,  20:45 Найти цитируемый пост)
В какую переменную сохраняются? Меня интересуют системные флаги формата

Хочешь посмотреть как оно сделано? STL опенсурсная - открой да посмотри.

Из bits/ios_base.h
Код
  enum _Ios_Openmode
    {
      _S_app        = 1L << 0,
      _S_ate        = 1L << 1,
      _S_bin        = 1L << 2,
      _S_in         = 1L << 3,
      _S_out        = 1L << 4,
      _S_trunc      = 1L << 5,
      _S_ios_openmode_end = 1L << 16
    };

  inline _Ios_Openmode
  operator&(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }

  inline _Ios_Openmode
  operator|(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }

  inline _Ios_Openmode
  operator^(_Ios_Openmode __a, _Ios_Openmode __b)
  { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }

  inline _Ios_Openmode&
  operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a | __b; }

  inline _Ios_Openmode&
  operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a & __b; }

  inline _Ios_Openmode&
  operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
  { return __a = __a ^ __b; }

  inline _Ios_Openmode
  operator~(_Ios_Openmode __a)
  { return _Ios_Openmode(~static_cast<int>(__a)); }

...

    // 27.4.2.1.4  Type ios_base::openmode
    /**
     *  @brief This is a bitmask type.
     *
     *  @c "_Ios_Openmode" is implementation-defined, but it is valid to
     *  perform bitwise operations on these values and expect the Right
     *  Thing to happen.  Defined objects of type openmode are:
     *  - app
     *  - ate
     *  - binary
     *  - in
     *  - out
     *  - trunc
    */
    typedef _Ios_Openmode openmode;

T.e. комбинации флагов хранятся в том же enum-е.

А в fstream-ах есть аттрибут типа basic_filebuf с аттрибутом
Код
      /**
       *  @if maint
       *  Place to stash in || out || in | out settings for current filebuf.
       *  @endif
      */
      ios_base::openmode    _M_mode;

Автор: Fazil6 4.6.2007, 23:27
Цитата(S.A.G. @  4.6.2007,  21:45 Найти цитируемый пост)
Сами флаги суть константы целого типа. В какую переменную сохраняются? Меня интересуют системные флаги формата а не отфонарные

мда... 
Теория. Есть некая переменная в обекте. Флаги для объекта - это биты этой переменной. ios::showpos - это битовая маска, позволяющая установить определенные биты и setf просто применяет побитовую операцию с этой маской и в результате выставляются определенные биты.

Автор: S.A.G. 4.6.2007, 23:58
Таааак. Значения перечислимого типа это не флаги а по сути дела вспомагательные константы с еденичками в определенных разрядах. А теперь финальный вопрос будет такой: как наз. переменная в которой все это дело комбинируется?

Выходит система каждый раз проверяет состояние битов в этой переменной прежде чем осуществить ввод/вывод в конкретный поток для которого установлены эти флаги.

А если установить противоречивые флаги? Например сначала левое а потом правое выравнивание? Левое збросится после установки правого?

И спасибо всем за помощь не смотря на то как она оказывалась. smile

Автор: Xenon 5.6.2007, 00:12
Может для этого удобнее использовать bitset?

Автор: S.A.G. 5.6.2007, 13:02
И в чем отрицательные эмоции? Я сделал неправильные выводы? Поправьте меня. smile

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