Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Флаги формата и оператор :: Просьба разъяснить 
:(
    Опции темы
S.A.G.
Дата 4.6.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



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

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

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

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

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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 19:25


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
vinter
Дата 4.6.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 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 Найти цитируемый пост)
Где они объявлены?


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




--------------------
Мой блог
PM MAIL WWW   Вверх
S.A.G.
Дата 4.6.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Отредактировал изначальный вопрос.

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

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

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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 20:54


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Rockie
Дата 4.6.2007, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



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


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

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





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
vinter
Дата 4.6.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



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

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


--------------------
Мой блог
PM MAIL WWW   Вверх
S.A.G.
Дата 4.6.2007, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Rockie, об установке битов я знаю. Я знаю что если бит равен 0 то он сброшен а если 1 то установлен..

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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 21:00


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
bsa
Дата 4.6.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



блин. проще на примере:
Код
#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;


Это сообщение отредактировал(а) bsa - 4.6.2007, 21:06
PM   Вверх
Fazil6
Дата 4.6.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

Значения флагов константы. При установке эти значения запоминаются в объекте. Что тут непонятного?
PM MAIL   Вверх
S.A.G.
Дата 4.6.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



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

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

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

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

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

Это сообщение отредактировал(а) S.A.G. - 4.6.2007, 21:22


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Fazil6
Дата 4.6.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

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

никак. Сами по себе они такого типа, а   внутри объекта они сохраняются в обычную переменную
PM MAIL   Вверх
bsa
Дата 4.6.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(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

PM   Вверх
Fazil6
Дата 4.6.2007, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

это и есть флаги
PM MAIL   Вверх
S.A.G.
Дата 4.6.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Цитата(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)
никак. Сами по себе они такого типа, а   внутри объекта они сохраняются в обычную переменную

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


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
nickless
Дата 4.6.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(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;


Это сообщение отредактировал(а) nickless - 4.6.2007, 23:11


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Fazil6
Дата 4.6.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

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

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.