I/O manipulators | ||||
Print functions(C++23) | ||||
C-style I/O | ||||
Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
Streams | ||||
Abstractions | ||||
File I/O | ||||
String I/O | ||||
Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
Synchronized Output | ||||
(C++20) | ||||
Types | ||||
Error category interface | ||||
(C++11) | ||||
(C++11) |
|
|
protected: virtual int_type overflow( int_type ch= Traits::eof()); | ||
The intent of this function is to transmit characters from theput area of the stream buffer to theassociated 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 (seeimplementation requirements). The standard library providesstd::strstreambuf::overflow(),(until C++26)std::basic_stringbuf::overflow() andstd::basic_filebuf::overflow().
Contents |
ch | - | the character to store in the put area |
Traits::eof()
Every overriding definition of this virtual function must obey the following constraints, otherwise the behavior is undefined:
Thesputc() andsputn() call this function in case of an overflow (pptr()== nullptr orpptr()>= epptr()).
#include <array>#include <cstddef>#include <iostream> // Buffer for std::ostream implemented by std::arraytemplate<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";elsestd::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 \0stream is goodh e l l o w o r l d stream is goodoverflowh e l l o w o r l d stream is not good
[virtual] | reads characters from the associated input sequence to the get area and advances the next pointer (virtual protected member function)[edit] |
[virtual] | reads characters from the associated input sequence to the get area (virtual protected member function)[edit] |
[virtual] | writes characters to the associated file from the put area (virtual protected member function of std::basic_filebuf<CharT,Traits> )[edit] |
[virtual] | appends a character to the output sequence (virtual protected member function of std::basic_stringbuf<CharT,Traits,Allocator> )[edit] |
[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 )[edit] |