30 Input/output library [input.output]

30.8 String-based streams [string.streams]

30.8.2 Class template basic_­stringbuf [stringbuf]

namespace std {
  template <class charT, class traits = char_traits<charT>,
            class Allocator = allocator<charT>>
  class basic_stringbuf : public basic_streambuf<charT, traits> {
  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;
    using allocator_type = Allocator;

    // [stringbuf.cons], constructors
    explicit basic_stringbuf(
      ios_base::openmode which = ios_base::in | ios_base::out);
    explicit basic_stringbuf(
      const basic_string<charT, traits, Allocator>& str,
      ios_base::openmode which = ios_base::in | ios_base::out);
    basic_stringbuf(const basic_stringbuf& rhs) = delete;
    basic_stringbuf(basic_stringbuf&& rhs);

    // [stringbuf.assign], assign and swap
    basic_stringbuf& operator=(const basic_stringbuf& rhs) = delete;
    basic_stringbuf& operator=(basic_stringbuf&& rhs);
    void swap(basic_stringbuf& rhs);

    // [stringbuf.members], get and set
    basic_string<charT, traits, Allocator> str() const;
    void str(const basic_string<charT, traits, Allocator>& s);

  protected:
    // [stringbuf.virtuals], overridden virtual functions
    int_type underflow() override;
    int_type pbackfail(int_type c = traits::eof()) override;
    int_type overflow (int_type c = traits::eof()) override;
    basic_streambuf<charT, traits>* setbuf(charT*, streamsize) override;

    pos_type seekoff(off_type off, ios_base::seekdir way,
                     ios_base::openmode which
                      = ios_base::in | ios_base::out) override;
    pos_type seekpos(pos_type sp,
                     ios_base::openmode which
                      = ios_base::in | ios_base::out) override;

  private:
    ios_base::openmode mode;  // exposition only
  };

  template <class charT, class traits, class Allocator>
    void swap(basic_stringbuf<charT, traits, Allocator>& x,
              basic_stringbuf<charT, traits, Allocator>& y);
}

Класс basic_­stringbuf является производным от, basic_­streambuf чтобы связать, возможно, входную последовательность и, возможно, выходную последовательность с произвольной последовательностью characters. Последовательность может быть инициализирована или сделана доступной как объект класса basic_­string.

Для демонстрации поддерживаемые данные представлены здесь как:

  • ios_­base​::​openmode mode, in установлен, если входная последовательность может быть прочитана, и out установлена, если выходная последовательность может быть записана.

30.8.2.1 basic_­stringbuf constructors [stringbuf.cons]

explicit basic_stringbuf( ios_base::openmode which = ios_base::in | ios_base::out);

Effects: Создает объект класса basic_­stringbuf, инициализируя базовый класс с помощью basic_­streambuf() ([streambuf.cons]) и инициализируя mode с помощьюwhich.

Postconditions: str() == "".

explicit basic_stringbuf( const basic_string<charT, traits, Allocator>& s, ios_base::openmode which = ios_base::in | ios_base::out);

Effects: Создает объект класса basic_­stringbuf, инициализируя базовый класс с помощью basic_­streambuf() ([streambuf.cons]) и инициализируя mode с помощьюwhich. Потом звонитstr(s).

basic_stringbuf(basic_stringbuf&& rhs);

Effects: Переместите конструкции из rvaluerhs. Это определяется реализация ли указатели последовательности в*this (eback(),gptr(),egptr(), pbase(),pptr(),epptr()) получить значение , которыеrhs имели. Независимо от того, работают они или нет,*this иrhs ссылаются на отдельные буферы (если они вообще есть) после построения. Также копируются режим openmode, locale и любое другое состояниеrhs .

Postconditions: Позвольтеrhs_­p ссылаться на состояние rhs непосредственно перед этой конструкцией и позвольтеrhs_­a ссылаться на состояниеrhs сразу после этой конструкции.

  • str() == rhs_­p.str()

  • gptr() - eback() == rhs_­p.gptr() - rhs_­p.eback()

  • egptr() - eback() == rhs_­p.egptr() - rhs_­p.eback()

  • pptr() - pbase() == rhs_­p.pptr() - rhs_­p.pbase()

  • epptr() - pbase() == rhs_­p.epptr() - rhs_­p.pbase()

  • if (eback()) eback() != rhs_­a.eback()

  • if (gptr()) gptr() != rhs_­a.gptr()

  • if (egptr()) egptr() != rhs_­a.egptr()

  • if (pbase()) pbase() != rhs_­a.pbase()

  • if (pptr()) pptr() != rhs_­a.pptr()

  • if (epptr()) epptr() != rhs_­a.epptr()

30.8.2.2 Assign and swap [stringbuf.assign]

basic_stringbuf& operator=(basic_stringbuf&& rhs);

Effects: После того, как присвоение хода*this приобрело наблюдаемое состояние, оно было бы, если бы оно было построено изrhs (см.[stringbuf.cons]).

Returns:*this.

void swap(basic_stringbuf& rhs);

Effects: Меняет состояние*this иrhs.

template <class charT, class traits, class Allocator> void swap(basic_stringbuf<charT, traits, Allocator>& x, basic_stringbuf<charT, traits, Allocator>& y);

Effects: Как будто мимоx.swap(y).

30.8.2.3 Member functions [stringbuf.members]

basic_string<charT, traits, Allocator> str() const;

Returns: basic_­string Объект, содержание которого равна basic_­stringbuf базовой последовательности символов. Еслиbasic_­stringbuf был создан только в режиме ввода, результат будет basic_­string содержать последовательность символов в диапазоне [eback(), egptr()). Еслиbasic_­stringbuf был создан с which & ios_­base​::​out ненулевым значением, то результатbasic_­string содержит последовательность символов в диапазоне[pbase(), high_­mark), где high_­mark представляет позицию после самого высокого инициализированного символа в буфере. Символы можно инициализировать путем записи в поток, создания сbasic_­stringbuf помощью abasic_­stringили вызова str(basic_­string) функции-члена. В случае вызова str(basic_­string) функции-члена все символы, инициализированные до вызова, теперь считаются неинициализированными (за исключением тех символов, которые повторно инициализированы новымbasic_­string). В противном случаеbasic_­stringbuf объект не был создан ни в режиме ввода, ни в режиме вывода, иbasic_­string возвращается нулевая длина .

void str(const basic_string<charT, traits, Allocator>& s);

Effects: Копирует содержимоеs вbasic_­stringbuf базовую последовательность символов и инициализирует входные и выходные последовательности в соответствии сmode.

Postconditions: Еслиmode & ios_­base​::​out не ноль,pbase() указывает на первый базовый символ иepptr()>= pbase() + s.size() удерживается; кроме того, если неmode & ios_­base​::​ate равно нулю, то pptr() == pbase() + s.size() имеет место, иначеpptr() == pbase() - нетtrue. Если неmode & ios_­base​::​in равно нулю,eback() указывает на первый базовый символ, и обаgptr() == eback() иegptr() == eback() + s.size() удерживаются.

30.8.2.4 Overridden virtual functions [stringbuf.virtuals]

int_type underflow() override;

Returns: Если входная последовательность имеет доступную позицию чтения, возвращается traits​::​to_­int_­type(*gptr()). В противном случае возвращается traits​::​eof(). Любой инициализированный символ в нижележащем буфере считается частью входной последовательности.

int_type pbackfail(int_type c = traits::eof()) override;

Effects: Возвращает символ, обозначенный значком,c во входную последовательность, если это возможно, одним из трех способов:

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается ,false и если входная последовательность имеет место Putback доступный, и если traits​::​eq(to_­char_­type(c), gptr()[-1]) возвращается true, правопреемники gptr() - 1 в gptr().

    Возвращает: c.

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается ,false и если входная последовательность имеет место Putback доступный, и если неmode & ios_­base​::​out равен нулю, правопреемниковc к *--gptr().

    Возвращает: c.

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается ,true и если входная последовательность имеет место Putback доступный, правопреемники gptr() - 1 к gptr().

    Возвращает: traits​::​not_­eof(c).

Returns: traits​::​eof() для обозначения отказа.

Remarks: Если функция может быть успешной более чем одним из этих способов, не указано, какой путь будет выбран.

int_type overflow(int_type c = traits::eof()) override;

Effects: Добавляет символ, обозначенный значком,c к выходной последовательности, если возможно, одним из двух способов:

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается, false и если либо выходная последовательность имеет доступную позицию записи, либо функция делает доступной позицию записи (как описано ниже), функция вызывает sputc(c).

    Сигнализирует об успехе, возвращаясьc.

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается true, нет символа для добавления.

    Сигнализирует об успехе, возвращая значение, отличное от traits​::​eof().

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

Returns: traits​::​eof() для обозначения отказа.

Функция может сделать позицию записи доступной, только если (mode & ios_­base​::​out) != 0. Чтобы сделать позицию записи доступной, функция перераспределяет (или первоначально выделяет) объект массива с достаточным количеством элементов, чтобы удерживать текущий объект массива (если есть), плюс по крайней мере одну дополнительную позицию записи. Если (mode & ios_­base​::​in) != 0, функция изменяет указатель конца чтения так, egptr() чтобы он указывал сразу за новой позицией записи.

pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;

Effects: Если возможно, изменяет положение потока в одной из управляемых последовательностей, как указано в Табл115.

Стол115 -seekoff позиционирование
УсловияРезультат
(which & ios_­base​::​in) == ios_­base​::​in позиционирует входную последовательность
(which & ios_­base​::​out) == ios_­base​::​out позиционирует выходную последовательность
(which & (ios_­base​::​in |
ios_­base​::​out)) ==
(ios_­base​::​in) |
ios_­base​::​out))
иway == либо,
ios_­base​::​beg либо
ios_­base​::​end
позиционирует как входную, так и выходную последовательности
Иначе операция позиционирования не выполняется.

Для позиционирования последовательности, если ее следующий указатель (или gptr() или pptr()) является нулевым указателем, а новое смещение неnewoff равно нулю, операция позиционирования завершается ошибкой. В противном случае функция определяет,newoff как указано в таблице116.

Таблица116 -newoff значения
Состояниеnewoff Ценить
way == ios_­base​::​beg 0
way == ios_­base​::​cur следующий указатель минус указатель начала (xnext - xbeg).
way == ios_­base​::​end указатель верхней отметки минус указатель начала (high_­mark - xbeg).

Если (newoff + off) < 0или еслиnewoff + off относится к неинициализированному символу ([stringbuf.members]), операция позиционирования завершается ошибкой. В противном случае функция присваивает xbeg + newoff + off следующий указательxnext.

Returns: pos_­type(newoff), построенный из результирующего смещенияnewoff (типа off_­type), в котором, если возможно, сохраняется позиция результирующего потока. Если операция позиционирования завершается неудачно, или если сконструированный объект не может представлять позицию результирующего потока, возвращается значение pos_­type(off_­type(-1)).

pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out) override;

Effects: Эквивалентноseekoff(off_­type(sp), ios_­base​::​beg, which).

Returns: sp для обозначения успеха или pos_­type(off_­type(-1)) неудачи.

basic_streambuf<charT, traits>* setbuf(charT* s, streamsize n);

Effects: определяется реализацией, за исключением того, что setbuf(0, 0) это не имеет никакого эффекта.

Returns: this.