235 lines
8.7 KiB
Markdown
235 lines
8.7 KiB
Markdown
[stringbuf.virtuals]
|
||
|
||
# 31 Input/output library [[input.output]](./#input.output)
|
||
|
||
## 31.8 String-based streams [[string.streams]](string.streams#stringbuf.virtuals)
|
||
|
||
### 31.8.2 Class template basic_stringbuf [[stringbuf]](stringbuf#virtuals)
|
||
|
||
#### 31.8.2.5 Overridden virtual functions [stringbuf.virtuals]
|
||
|
||
[ð](#lib:underflow,basic_stringbuf)
|
||
|
||
`int_type underflow() override;
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8621)
|
||
|
||
*Returns*: If the input sequence has a read position available,
|
||
returnstraits::to_int_type(*gptr())[.](#1.sentence-1)
|
||
|
||
Otherwise, returnstraits::eof()[.](#1.sentence-2)
|
||
|
||
Any character in the underlying buffer which has been initialized is considered
|
||
to be part of the input sequence[.](#1.sentence-3)
|
||
|
||
[ð](#lib:pbackfail,basic_stringbuf)
|
||
|
||
`int_type pbackfail(int_type c = traits::eof()) override;
|
||
`
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8638)
|
||
|
||
*Effects*: Puts back the character designated by c to the input
|
||
sequence, if possible, in one of three ways:
|
||
|
||
- [(2.1)](#2.1)
|
||
|
||
Iftraits::eq_int_type(c, traits::eof()) returnsfalse and
|
||
if the input sequence has a putback position available, and
|
||
iftraits::eq(to_char_type(c), gptr()[-1]) returnstrue,
|
||
assignsgptr() - 1 togptr()[.](#2.1.sentence-1)
|
||
Returns:c[.](#2.1.sentence-2)
|
||
|
||
- [(2.2)](#2.2)
|
||
|
||
Iftraits::eq_int_type(c, traits::eof()) returnsfalse and if the input sequence
|
||
has a putback position available, and
|
||
if *mode*&ios_base::out is
|
||
nonzero,
|
||
assigns c to*--gptr()[.](#2.2.sentence-1)
|
||
Returns:c[.](#2.2.sentence-2)
|
||
|
||
- [(2.3)](#2.3)
|
||
|
||
Iftraits::eq_int_type(c, traits::eof()) returnstrue and if the input sequence has a putback position available,
|
||
assignsgptr() - 1 togptr()[.](#2.3.sentence-1)
|
||
Returns:traits::not_eof(c)[.](#2.3.sentence-2)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8692)
|
||
|
||
*Returns*: As specified above, ortraits::eof() to indicate failure[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8698)
|
||
|
||
*Remarks*: If the function can succeed in more than one of these ways, it is
|
||
unspecified which way is chosen[.](#4.sentence-1)
|
||
|
||
[ð](#lib:overflow,basic_stringbuf)
|
||
|
||
`int_type overflow(int_type c = traits::eof()) override;
|
||
`
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8711)
|
||
|
||
*Effects*: Appends the character designated by c to the output
|
||
sequence, if possible, in one of two ways:
|
||
|
||
- [(5.1)](#5.1)
|
||
|
||
Iftraits::eq_int_type(c, traits::eof()) returnsfalse and if either
|
||
the output sequence has a write position available or
|
||
the function makes a write position available
|
||
(as described below),
|
||
the function callssputc(c)[.](#5.1.sentence-1)
|
||
Signals success by returning c[.](#5.1.sentence-2)
|
||
|
||
- [(5.2)](#5.2)
|
||
|
||
Iftraits::eq_int_type(c, traits::eof()) returnstrue,
|
||
there is no character to append[.](#5.2.sentence-1)
|
||
Signals success by returning a value other thantraits::eof()[.](#5.2.sentence-2)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8741)
|
||
|
||
*Returns*: As specified above, ortraits::eof() to indicate failure[.](#6.sentence-1)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8747)
|
||
|
||
*Remarks*: The function can alter the number of write positions available as a
|
||
result of any call[.](#7.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8752)
|
||
|
||
The function can make a write position available only ifios_base::out is set in *mode*[.](#8.sentence-1)
|
||
|
||
To make a write position available,
|
||
the function reallocates (or initially allocates) an array object
|
||
with a sufficient number of elements to hold
|
||
the current array object (if any), plus
|
||
at least
|
||
one additional write position[.](#8.sentence-2)
|
||
|
||
If ios_base::in is set in *mode*,
|
||
the function alters the read end pointeregptr() to point just past the new write position[.](#8.sentence-3)
|
||
|
||
[ð](#lib:seekoff,basic_stringbuf)
|
||
|
||
`pos_type seekoff(off_type off, ios_base::seekdir way,
|
||
ios_base::openmode which
|
||
= ios_base::in | ios_base::out) override;
|
||
`
|
||
|
||
[9](#9)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8775)
|
||
|
||
*Effects*: Alters the stream position within one of the
|
||
controlled sequences, if possible, as indicated in Table [144](#tab:stringbuf.seekoff.pos "Table 144: seekoff positioning")[.](#9.sentence-1)
|
||
|
||
Table [144](#tab:stringbuf.seekoff.pos) — seekoff positioning [[tab:stringbuf.seekoff.pos]](./tab:stringbuf.seekoff.pos)
|
||
|
||
| [ð](#tab:stringbuf.seekoff.pos-row-1)<br>**Conditions** | **Result** |
|
||
| --- | --- |
|
||
| [ð](#tab:stringbuf.seekoff.pos-row-2)<br>ios_base::in is set in which | positions the input sequence |
|
||
| [ð](#tab:stringbuf.seekoff.pos-row-3)<br>ios_base::out is set in which | positions the output sequence |
|
||
| [ð](#tab:stringbuf.seekoff.pos-row-4)<br>both ios_base::in and ios_base::out are set in which and either way == ios_base::beg or way == ios_base::end | positions both the input and the output sequences |
|
||
| [ð](#tab:stringbuf.seekoff.pos-row-5)<br>Otherwise | the positioning operation fails[.](#tab:stringbuf.seekoff.pos-row-5-column-2-sentence-1) |
|
||
|
||
[10](#10)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8795)
|
||
|
||
For a sequence to be positioned,
|
||
the function determines newoff as indicated in
|
||
Table [145](#tab:stringbuf.seekoff.newoff "Table 145: newoff values")[.](#10.sentence-1)
|
||
|
||
If the sequence's next pointer
|
||
(eithergptr() orpptr())
|
||
is a null pointer and newoff is nonzero,
|
||
the positioning operation fails[.](#10.sentence-2)
|
||
|
||
Table [145](#tab:stringbuf.seekoff.newoff) — newoff values [[tab:stringbuf.seekoff.newoff]](./tab:stringbuf.seekoff.newoff)
|
||
|
||
| [ð](#tab:stringbuf.seekoff.newoff-row-1)<br>**Condition** | **newoff Value** |
|
||
| --- | --- |
|
||
| [ð](#tab:stringbuf.seekoff.newoff-row-2)<br>way == ios_base::beg | 0 |
|
||
| [ð](#tab:stringbuf.seekoff.newoff-row-3)<br>way == ios_base::cur | the next pointer minus the beginning pointer (xnext - xbeg)[.](#tab:stringbuf.seekoff.newoff-row-3-column-2-sentence-1) |
|
||
| [ð](#tab:stringbuf.seekoff.newoff-row-4)<br>way == ios_base::end | the high mark pointer minus the beginning pointer (high_mark - xbeg)[.](#tab:stringbuf.seekoff.newoff-row-4-column-2-sentence-1) |
|
||
|
||
[11](#11)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8817)
|
||
|
||
If(newoff + off) < 0,
|
||
or if newoff + off refers to an uninitialized
|
||
character ([[stringbuf.members]](stringbuf.members "31.8.2.4 Member functions")),
|
||
the positioning operation fails[.](#11.sentence-1)
|
||
|
||
Otherwise, the function assignsxbeg + newoff + off to the next pointer xnext[.](#11.sentence-2)
|
||
|
||
[12](#12)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8827)
|
||
|
||
*Returns*: pos_type(newoff),
|
||
constructed from the resultant offset newoff (of typeoff_type),
|
||
that stores the resultant stream position, if possible[.](#12.sentence-1)
|
||
|
||
If the positioning operation fails, or
|
||
if the constructed object cannot represent the resultant stream position,
|
||
the return value ispos_type(off_type(-1))[.](#12.sentence-2)
|
||
|
||
[ð](#lib:seekpos,basic_stringbuf)
|
||
|
||
`pos_type seekpos(pos_type sp,
|
||
ios_base::openmode which
|
||
= ios_base::in | ios_base::out) override;
|
||
`
|
||
|
||
[13](#13)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8848)
|
||
|
||
*Effects*: Equivalent to seekoff(off_type(sp), ios_base::beg, which)[.](#13.sentence-1)
|
||
|
||
[14](#14)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8852)
|
||
|
||
*Returns*: sp to indicate success, orpos_type(off_type(-1)) to indicate failure[.](#14.sentence-1)
|
||
|
||
[ð](#lib:setbuf,basic_streambuf)
|
||
|
||
`basic_streambuf<charT, traits>* setbuf(charT* s, streamsize n) override;
|
||
`
|
||
|
||
[15](#15)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8866)
|
||
|
||
*Effects*: implementation-defined,
|
||
except thatsetbuf(0, 0) has no effect[.](#15.sentence-1)
|
||
|
||
[16](#16)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iostreams.tex#L8873)
|
||
|
||
*Returns*: this[.](#16.sentence-1)
|