std::basic_streambuf<CharT,Traits>:: overflow
|
protected
:
virtual int_type overflow ( int_type ch = Traits :: eof ( ) ) ; |
||
The intent of this function is to transmit characters from the put area of the stream buffer to the associated character sequence .
Formally, this function ensures that there is space at the put area for at least one character. The base class version always fails, and a possibly-succeeding implementation can only be provided in derived classes (see implementation requirements ). The standard library provides std::strstreambuf::overflow() , (until C++26) std::basic_stringbuf::overflow() and std::basic_filebuf::overflow() .
Contents |
Parameters
| ch | - | the character to store in the put area |
Return value
Traits :: eof ( )
Implementation requirements
Every overriding definition of this virtual function must obey the following constraints, otherwise the behavior is undefined:
- The effect of the function is to consume some initial subsequence of the characters of the pending sequence . The pending sequence is defined as the concatenation of the following sequences:
-
After consumption, the put area pointers are updated to hold the remaining characters, if any. Formally, let
r
be the number of characters in the pending sequence not consumed:
-
If
r
is non-zero, then
pbase()
and
pptr()
are set so that all following conditions are satisfied:
- pptr ( ) - pbase ( ) is r .
- The r characters starting at pbase() are the associated output stream.
- If r is zero (all characters of the pending sequence have been consumed), then either pbase() is set to a null value, or pbase() and pptr() are both set to the same non-null value.
-
If
r
is non-zero, then
pbase()
and
pptr()
are set so that all following conditions are satisfied:
- The function may fail if either appending some character to the associated output stream fails or if it is unable to establish pbase() and pptr() according to the above rules.
- If the function succeeds, returns some value other than Traits :: eof ( ) . Typically, ch is returned to indicate success, except when Traits :: eq_int_type ( ch, Traits :: eof ( ) ) returns true , in which case Traits :: not_eof ( ch ) is returned.
- If the function fails, returns Traits :: eof ( ) or throws an exception.
Note
The sputc() and sputn() call this function in case of an overflow ( pptr ( ) == nullptr or pptr ( ) >= epptr ( ) ).
Example
#include <array> #include <cstddef> #include <iostream> // Buffer for std::ostream implemented by std::array template<std::size_t size, class CharT = char> struct ArrayedStreamBuffer : std::basic_streambuf<CharT> { using Base = std::basic_streambuf<CharT>; using char_type = typename Base::char_type; using int_type = typename Base::int_type; ArrayedStreamBuffer() { // put area pointers to work with 'buffer' Base::setp(buffer.data(), buffer.data() + size); } int_type overflow(int_type ch) { std::cout << "overflow\n"; return Base::overflow(ch); } void print_buffer() { for (char_type i : buffer) { if (i == 0) std::cout << "\\0"; else std::cout << i; std::cout << ' '; } std::cout << '\n'; } private: std::array<char_type, size> buffer{}; // value-initialize buffer }; int main() { ArrayedStreamBuffer<10> streambuf; std::ostream stream(&streambuf); stream << "hello"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "world"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "!"; streambuf.print_buffer(); if (!stream.good()) std::cout << "stream is not good\n"; }
Output:
h e l l o \0 \0 \0 \0 \0 stream is good h e l l o w o r l d stream is good overflow h e l l o w o r l d stream is not good
See also
|
[virtual]
|
reads characters from the associated input sequence to the get area and advances the next pointer
(virtual protected member function) |
|
[virtual]
|
reads characters from the associated input sequence to the get area
(virtual protected member function) |
|
[virtual]
|
writes characters to the associated file from the put area
(virtual protected member function of
std::basic_filebuf<CharT,Traits>
)
|
|
[virtual]
|
appends a character to the output sequence
(virtual protected member function of
std::basic_stringbuf<CharT,Traits,Allocator>
)
|
|
[virtual]
|
appends a character to the output sequence, may reallocate or initially allocate the buffer if dynamic and not frozen
(virtual protected member function of
std::strstreambuf
)
|