30 Input/output library [input.output]

30.7 Formatting and manipulators [iostream.format]

30.7.5 Output streams [output.streams]

30.7.5.2 Formatted output functions [ostream.formatted]

30.7.5.2.1 Common requirements [ostream.formatted.reqmts]

Каждая функция форматированного вывода начинает выполнение с создания объекта класса sentry. Если этот объект возвращается true при преобразовании в значение типа bool, функция пытается сгенерировать запрошенный вывод. В случае сбоя генерации выполняется функция форматированного вывода setstate(ios_­base​::​failbit), которая может вызвать исключение. Если во время вывода возникает исключение, то ios​::​badbit включается320 в *thisсостоянии ошибки. Если (exceptions()&badbit) != 0 тогда исключение генерируется повторно. Независимо от того, выбрасывается ли исключение, sentry объект уничтожается до выхода из функции форматированного вывода. Если исключение не генерируется, результатом функции форматированного вывода будет *this.

Описания отдельных функций форматированного вывода описывают, как они выполняют вывод, и не упоминают sentry объект.

Если функция форматированного вывода потокаos определяет заполнение, это делается следующим образом. Для даннойcharT символьной последовательности,seq где charT - символьный тип потока, если длинаseq меньше чемos.width(), тоos.fill() к этой последовательности добавляется достаточное количество копий, необходимое для заполнения до шириныos.width() символов. Если (os.flags() & ios_­base​::​adjustfield) == ios_­base​::​left есть true, символы заполнения помещаются после последовательности символов; в противном случае они помещаются перед последовательностью символов.

не вызывая ios​::​failure броска.

30.7.5.2.2 Arithmetic inserters [ostream.inserters.arithmetic]

operator<<(bool val); operator<<(short val); operator<<(unsigned short val); operator<<(int val); operator<<(unsigned int val); operator<<(long val); operator<<(unsigned long val); operator<<(long long val); operator<<(unsigned long long val); operator<<(float val); operator<<(double val); operator<<(long double val); operator<<(const void* val);

Effects: Классы num_­get<> и num_­put<> обрабатывают зависящее от языкового стандарта числовое форматирование и синтаксический анализ. Эти функции вставки используют встроенное locale значение для форматирования чисел. Когдаval имеет тип bool, long, unsigned long, long long,unsigned long long, double, long double, или const void*, форматирование превращение происходит так , как будто он выполняется следующий фрагмент кода:

bool failed = use_facet<
  num_put<charT, ostreambuf_iterator<charT, traits>>
    >(getloc()).put(*this, *this, fill(), val).failed();

Когдаval is of type, short преобразование форматирования происходит так, как если бы оно выполняло следующий фрагмент кода:

ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
bool failed = use_facet<
  num_put<charT, ostreambuf_iterator<charT, traits>>
    >(getloc()).put(*this, *this, fill(),
    baseflags == ios_base::oct || baseflags == ios_base::hex
      ? static_cast<long>(static_cast<unsigned short>(val))
      : static_cast<long>(val)).failed();

Когдаval is of type, int преобразование форматирования происходит так, как если бы оно выполняло следующий фрагмент кода:

ios_base::fmtflags baseflags = ios_base::flags() & ios_base::basefield;
bool failed = use_facet<
  num_put<charT, ostreambuf_iterator<charT, traits>>
    >(getloc()).put(*this, *this, fill(),
    baseflags == ios_base::oct || baseflags == ios_base::hex
      ? static_cast<long>(static_cast<unsigned int>(val))
      : static_cast<long>(val)).failed();

Whenval is of type unsigned short или unsigned int преобразование форматирования происходит так, как если бы оно выполняло следующий фрагмент кода:

bool failed = use_facet<
  num_put<charT, ostreambuf_iterator<charT, traits>>
    >(getloc()).put(*this, *this, fill(),
      static_cast<unsigned long>(val)).failed();

Когдаval is of type, float преобразование форматирования происходит так, как если бы оно выполняло следующий фрагмент кода:

bool failed = use_facet<
  num_put<charT, ostreambuf_iterator<charT, traits>>
    >(getloc()).put(*this, *this, fill(),
      static_cast<double>(val)).failed();

Первый аргумент предоставляет объект ostreambuf_­iterator<> класса, который является итератором для классаbasic_­ostream<>. Он обходит ostreams и использует streambufs напрямую. Класс locale полагается на эти типы как на свой интерфейс к iostreams, поскольку для гибкости он абстрагирован от прямой зависимости от ostream. Второй параметр - это ссылка на подобъект базового класса типа ios_­base. Он предоставляет спецификации форматирования, такие как ширина поля и языковой стандарт, из которого можно получить другие фасеты. Если failed есть, true то это setstate(badbit)может вызвать исключение и вернуться.

Returns: *this.

30.7.5.2.3 basic_­ostream​::​operator<< [ostream.inserters]

basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& (*pf)(basic_ostream<charT, traits>&));

Effects: Никто. Не работает как функция форматированного вывода (как описано в[ostream.formatted.reqmts]).

Returns: pf(*this).321

basic_ostream<charT, traits>& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT, traits>&));

Effects: Звонки pf(*this). Этот модуль вставки не работает как функция форматированного вывода (как описано в разделе[ostream.formatted.reqmts]).

Returns: *this.322

basic_ostream<charT, traits>& operator<<(ios_base& (*pf)(ios_base&));

Effects: Звонки pf(*this). Этот модуль вставки не работает как функция форматированного вывода (как описано в разделе[ostream.formatted.reqmts]).

Returns: *this.

basic_ostream<charT, traits>& operator<<(basic_streambuf<charT, traits>* sb);

Effects: Ведет себя какunformatted output function. После того, как объект-часовой создан, if sb является нулевым вызовом setstate(badbit) (который может вызывать ios_­base​::​failure).

Получает символы изsb и вставляет их в *this. Символы считываютсяsb и вставляются до тех пор, пока не произойдет одно из следующих событий:

  • конец файла встречается во входной последовательности;

  • вставка в выходную последовательность не выполняется (в этом случае вставляемый символ не извлекается);

  • исключение возникает при получении символа изsb.

Если функция не вставляет символы, она вызывает setstate(failbit) (что может вызвать throw ios_­base​::​​failure ([iostate.flags])). Если было брошено исключение при извлечении персонажа, функция устанавливает failbit в состоянии ошибки, и если failbit на в exceptions() пойманном исключении является вызвано повторно.

Returns: *this.

basic_ostream<charT, traits>& operator<<(nullptr_t);

Effects: Эквивалентен:

return *this << s;

гдеs определяется реализацией NTCTS.

См., Например, сигнатуру функции endl(basic_­ostream&).

См., Например, сигнатуру функции dec(ios_­base&).

30.7.5.2.4 Character inserter function templates [ostream.inserters.character]

template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, charT c); template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, char c); // specialization template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, char c); // signed and unsigned template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, signed char c); template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, unsigned char c);

Effects: Ведет себя какformatted output function офout. Создает последовательность символовseq. Еслиc имеет тип, char а символьный тип потока - нет char, тоseq состоит из out.widen(c); в противном случаеseq состоит из c. Определяет заполнение,seq как описано в[ostream.formatted.reqmts]. Вставляетseq в out. Звонкиos.width(0).

Returns: out.

template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const charT* s); template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const char* s); template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const char* s); template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const signed char* s); template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const unsigned char* s);

Requires: s не должен быть нулевым указателем.

Effects: Работает как форматированный модуль вставки (как описано в разделе[ostream.formatted.reqmts]) изout. Создает последовательность символовseq изn символов , начиная сs, каждый расширена с помощью out.widen() ([basic.ios.members]), гдеn это число , которое будет вычислено как бы:

  • traits​::​length(s) для перегрузки, где первый аргумент имеет тип, basic_­ostream<charT, traits>& а второй - типа const charT*, а также для перегрузки, где первый аргумент имеет тип, basic_­ostream<char, traits>& а второй - тип const char*,

  • char_­traits<char>​::​length(s) для перегрузки, где первый аргумент имеет тип, basic_­ostream<charT, traits>& а второй - тип const char*,

  • traits​::​length(reinterpret_­cast<const char*>(s)) для двух других перегрузок.

Определяет заполнение,seq как описано в[ostream.formatted.reqmts]. Вставляетseq в out. Звонкиwidth(0).

Returns: out.