Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::basic_...f::overflow(3)  C++ Standard Libary std::basic_...f::overflow(3)

NAME
       std::basic_streambuf::overflow -	std::basic_streambuf::overflow

Synopsis
	  protected:
	  virtual int_type overflow( int_type ch = Traits::eof() );

	  Ensures that there is	space at the put area for at least one charac-
       ter by saving
	  some	initial	 subsequence  of characters starting at	pbase()	to the
       output sequence
	  and updating the pointers to the put area (if	needed). If ch is  not
       Traits::eof()
	  (i.e.	 Traits::eq_int_type(ch, Traits::eof())	!= true), it is	either
       put to the put
	  area or directly saved to the	output sequence.

	  The function may update pptr,	epptr and pbase	pointers to define the
       location	to
	  write	more data. On failure, the function ensures that either	pptr()
       == nullptr or
	  pptr() == epptr.

	  The base class version of the	function  does	nothing.  The  derived
       classes may
	  override  this function to allow updates to the put area in the case
       of exhaustion.

Parameters
	  ch - the character to	store in the put area

Return value
	  Returns unspecified value not	equal  to  Traits::eof()  on  success,
       Traits::eof() on
	  failure.

	  The base class version of the	function returns Traits::eof().

Note
	  The  sputc()	and  sputn() call this function	in case	of an overflow
       (pptr() == nullptr
	  or pptr() >= epptr()).

Example
       // Run this code

	#include <iostream>
	#include <array>

	// Buffer for std::ostream implemented by std::array
	template<std::size_t SIZE, class CharT = char>
	class ArrayedStreamBuffer : public std::basic_streambuf<CharT> {
	public:

	    using Base = std::basic_streambuf<CharT>;
	    using char_type = typename Base::char_type;
	    using int_type = typename Base::int_type;

	    ArrayedStreamBuffer() : buffer_{} // value-initialize  buffer_  to
       all zeroes
	    {
		Base::setp(buffer_.begin(),  buffer_.end());  //  set std::ba-
       sic_streambuf
		    // put area	pointers to work with 'buffer_'
	    }

	    int_type overflow(int_type ch)
	    {
		std::cout << "overflow\n";
		return Base::overflow(ch);
	    }

	    void print_buffer()
	    {
		for (const auto& i: buffer_) {
		    if (i == 0)	{
			std::cout << "\\0";
		    } else {
			std::cout << i;
		    }
		    std::cout << ' ';
		}
		std::cout << '\n';
	    }

	private:
	    std::array<char_type, SIZE>	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
	  uflow	    reads characters from the associated input sequence	to the
       get area	and
	  [virtual] advances the next pointer
		    (virtual protected member function)
	  underflow reads characters from the associated input sequence	to the
       get area
	  [virtual] (virtual protected member function)
	  overflow  writes characters to the associated	file from the put area
	  [virtual] (virtual protected	member	function  of  std::basic_file-
       buf<CharT,Traits>)
	  overflow  appends a character	to the output sequence
	  [virtual] (virtual protected member function of
		    std::basic_stringbuf<CharT,Traits,Allocator>)
	  overflow  appends a character	to the output sequence,	may reallocate
       or initially
	  [virtual] allocate the buffer	if dynamic and not frozen
		    (virtual protected member function of std::strstreambuf)

http://cppreference.com		  2022.07.31	  std::basic_...f::overflow(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::basic_streambuf::overflow&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help