30 Input/output library [input.output]

30.5 Iostreams base classes [iostreams.base]

30.5.5 Class template basic_­ios [ios]

30.5.5.1 Overview [ios.overview]

namespace std {
  template <class charT, class traits = char_traits<charT>>
  class basic_ios : public ios_base {
  public:
    using char_type   = charT;
    using int_type    = typename traits::int_type;
    using pos_type    = typename traits::pos_type;
    using off_type    = typename traits::off_type;
    using traits_type = traits;

    // [iostate.flags], flags functions
    explicit operator bool() const;
    bool operator!() const;
    iostate rdstate() const;
    void clear(iostate state = goodbit);
    void setstate(iostate state);
    bool good() const;
    bool eof()  const;
    bool fail() const;
    bool bad()  const;

    iostate exceptions() const;
    void exceptions(iostate except);

    // [basic.ios.cons], constructor/destructor
    explicit basic_ios(basic_streambuf<charT, traits>* sb);
    virtual ~basic_ios();

    // [basic.ios.members], members
    basic_ostream<charT, traits>* tie() const;
    basic_ostream<charT, traits>* tie(basic_ostream<charT, traits>* tiestr);

    basic_streambuf<charT, traits>* rdbuf() const;
    basic_streambuf<charT, traits>* rdbuf(basic_streambuf<charT, traits>* sb);

    basic_ios& copyfmt(const basic_ios& rhs);

    char_type fill() const;
    char_type fill(char_type ch);

    locale imbue(const locale& loc);

    char      narrow(char_type c, char dfault) const;
    char_type widen(char c) const;

    basic_ios(const basic_ios&) = delete;
    basic_ios& operator=(const basic_ios&) = delete;

  protected:
    basic_ios();
    void init(basic_streambuf<charT, traits>* sb);
    void move(basic_ios& rhs);
    void move(basic_ios&& rhs);
    void swap(basic_ios& rhs) noexcept;
    void set_rdbuf(basic_streambuf<charT, traits>* sb);

  };
}

30.5.5.2 basic_­ios constructors [basic.ios.cons]

explicit basic_ios(basic_streambuf<charT, traits>* sb);

Effects: Создает объект класса basic_­ios, присваивая начальные значения его объектам-членам путем вызова init(sb).

basic_ios();

Effects: Создает объект класса basic_­ios ([ios.base.cons]), оставляя его объекты-члены неинициализированными. Объект должен быть инициализирован вызовом basic_­ios​::​init до его первого использования или до его уничтожения, в зависимости от того, что произойдет раньше; в противном случае поведение не определено.

~basic_ios();

Remarks: Деструктор не разрушает rdbuf().

void init(basic_streambuf<charT, traits>* sb);

Postconditions: Постусловия этой функции указаны в таблице113.

Таблица113 -basic_­ios​::​init() эффекты
ЭлементЦенить
rdbuf() sb
tie() 0
rdstate() goodbit еслиsb не является нулевым указателем, в противном случаеbadbit.
exceptions() goodbit
flags() skipws | dec
width() 0
precision() 6
fill() widen(' ')
getloc() копия значения, возвращаемогоlocale()
iarray нулевой указатель
parray нулевой указатель

30.5.5.3 Member functions [basic.ios.members]

basic_ostream<charT, traits>* tie() const;

Returns: Выходная последовательность, которая tied должна (синхронизироваться) с последовательностью, управляемой буфером потока.

basic_ostream<charT, traits>* tie(basic_ostream<charT, traits>* tiestr);

Requires: Еслиtiestr не равно нулю, онtiestr не должен быть доступен при просмотре связанного списка связанных объектов потока, начиная с tiestr->tie().

Postconditions: tiestr == tie().

Returns: Предыдущее значение tie().

basic_streambuf<charT, traits>* rdbuf() const;

Returns: Указатель на streambuf связанный с потоком.

basic_streambuf<charT, traits>* rdbuf(basic_streambuf<charT, traits>* sb);

Postconditions: sb == rdbuf().

Effects: Звонки clear().

Returns: Предыдущее значение rdbuf().

locale imbue(const locale& loc);

Effects: Вызывает ios_­base​::​imbue(loc) ([ios.base.locales]), а если rdbuf() != 0 то rdbuf()->pubimbue(loc) ([streambuf.locales]).

Returns: Приоритетное значение ios_­base​::​imbue().

char narrow(char_type c, char dfault) const;

Returns: use_­facet<ctype<char_­type>>(getloc()).narrow(c, dfault)

char_type widen(char c) const;

Returns: use_­facet<ctype<char_­type>>(getloc()).widen(c)

char_type fill() const;

Returns: Символ, используемый для заполнения (заполнения) преобразования вывода до указанной ширины поля.

char_type fill(char_type fillch);

Postconditions: traits​::​eq(fillch, fill()).

Returns: Предыдущее значение fill().

basic_ios& copyfmt(const basic_ios& rhs);

Effects: Если (this == &rhs) ничего не делает. В противном случае присваивает объектам *this -членам соответствующих объектов-членовrhs следующим образом:

  1. 1.вызывает каждую зарегистрированную пару обратных вызовов(fn, index) как (*fn)(erase_­event, *this, index);

  2. 2.присваивается объектам*this -членам соответствующих объектов-членов rhs, за исключением того, что

    • rdstate(),,rdbuf()иexceptions() остаются без изменений;

    • копируется содержимое массивов, на которые указываетpword иiword , а не сами указатели;296 а также

    • если какие-либо вновь сохраненные значения указателя*this указывают на объекты, хранящиеся вне объекта,rhs и эти объекты уничтожаются приrhs уничтожении, вновь сохраненные значения указателя изменяются, чтобы указывать на вновь созданные копии объектов;

  3. 3.вызывает каждую пару обратных вызовов, скопированную изrhs as (*fn)(copyfmt_­event, *this, index);

  4. 4.звонкиexceptions(rhs.exceptions()).

[ Note: Второй проход через пары обратного вызова позволяетpword обнулить скопированное значение, либо глубоко скопировать его референт, либо подсчитать ссылку, либо выполнить другие специальные действия. ]end note

Postconditions: Постусловия этой функции указаны в таблице114.

Таблица114 -basic_­ios​::​copyfmt() эффекты
ЭлементЦенить
rdbuf() unchanged
tie() rhs.tie()
rdstate() unchanged
exceptions() rhs.exceptions()
flags() rhs.flags()
width() rhs.width()
precision() rhs.precision()
fill() rhs.fill()
getloc() rhs.getloc()

Returns: *this.

void move(basic_ios& rhs); void move(basic_ios&& rhs);

Postconditions:*this должен иметь состояние, которое rhs было до вызова функции, за исключением тогоrdbuf() , что должен возвращать 0.rhs должен быть в допустимом, но неуказанном состоянии, за исключением тогоrhs.rdbuf() , что должен возвращать то же значение, что и перед вызовом функции, и rhs.tie() должен возвращать 0.

void swap(basic_ios& rhs) noexcept;

Effects: Состояниями*this иrhs необходимо поменять местами, за исключением тогоrdbuf() , что они должны возвращать то же значение, что и перед вызовом функции, иrhs.rdbuf() должны возвращать то же значение, что и перед вызовом функции.

void set_rdbuf(basic_streambuf<charT, traits>* sb);

Requires:sb != nullptr.

Effects: Связываетbasic_­streambuf объект, на который указываетsb этот поток, без вызова clear().

Postconditions:rdbuf() == sb.

Throws: Ничего такого.

Это предполагает бесконечное количество копий, но реализация может отслеживать максимальный элемент массивов, который не равен нулю.

30.5.5.4 basic_­ios flags functions [iostate.flags]

explicit operator bool() const;

Returns:!fail().

bool operator!() const;

Returns: fail().

iostate rdstate() const;

Returns: Состояние ошибки буфера потока.

void clear(iostate state = goodbit);

Postconditions: Если rdbuf() != 0 тогда state == rdstate(); иначе rdstate() == (state | ios_­base​::​badbit).

Effects: Если((state | (rdbuf() ? goodbit : badbit)) & exceptions()) == 0, вернется. В противном случае функция генерирует объект класса basic_­ios​::​failure, построенный со значениями аргументов, определяемыми реализацией.

void setstate(iostate state);

Effects: Звонки clear(rdstate() | state) (которые могут бросить basic_­ios​::​failure).

bool good() const;

Returns: rdstate() == 0

bool eof() const;

Returns: true если eofbit установлен в rdstate().

bool fail() const;

Returns: true если failbit или badbit установлен в rdstate().297

bool bad() const;

Returns: true если badbit установлен в rdstate().

iostate exceptions() const;

Returns: Маска, определяющая, какие элементы установлены в rdstate() вызове исключения.

void exceptions(iostate except);

Postconditions: except == exceptions().

Effects: Звонки clear(rdstate()).

Проверка badbit также на fail() историческую практику.