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_stringbuf::overflow -	std::basic_stringbuf::overflow

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

	  Appends the character	c to the output	character sequence.

	  If   c   is	the   end-of-file   indicator  (traits::eq_int_type(c,
       traits::eof()) == true),
	  then there is	no character to	append.	The function does nothing  and
       returns an
	  unspecified value other than traits::eof().

	  Otherwise,  if the output sequence has a write position available or
       this function
	  can  successfully  make  a  write  position  available,  then	 calls
       sputc(c)	and returns c.

	  This	 function   can	  make	a  write  position  available  if  the
       std::stringbuf is open for
	  output ((mode	& ios_base::out) != 0):	in this	case,  it  reallocates
       (or initially
	  allocates)  the  buffer big enough to	hold the entire	current	buffer
       plus at least one
	  more character. If the std::stringbuf	is also	open for input	((mode
       & ios_base::in)
	  != 0), then overflow also increases the size of the get area by mov-
       ing egptr() to
	  point	just past the new write	position.

Parameters
	  c - the character to store in	the put	area

Return value
	  Traits::eof()	to indicate failure, c if the character	c was success-
       fully appended,
	  or  some value other than Traits::eof() if called with Traits::eof()
       as the argument.

Notes
	  This function	is different from a typical overflow() which moves the
       contents	of the
	  buffer to the	associated character sequence because for  a  std::ba-
       sic_stringbuf, the
	  buffer and the associated sequence are one and the same.

Example
	  In  the  implementation used to execute this example (e.g. GCC-4.9),
       overflow()
	  over-allocates the put area to 512 bytes: a call to str() would only
       return the four
	  initialized bytes, but the next 508 calls to sputc() would  not  re-
       quire new calls to
	  overflow().

       // Run this code

	#include <sstream>
	#include <iostream>

	struct mybuf : std::stringbuf
	{
	    mybuf(const	std::string& new_str,
		  std::ios_base::openmode    which   =	 std::ios_base::in   |
       std::ios_base::out)
		: std::stringbuf(new_str, which) {}

	    int_type overflow(int_type c = EOF)	override
	    {
		std::cout  <<  "stringbuf::overflow('"	<<  char(c)   <<   "')
       called\n"
			  << "Before: size of get area:	" << egptr() - eback()
       << '\n'
			  << "	      size of put area:	" << epptr() - pbase()
       << '\n';

		int_type ret = std::stringbuf::overflow(c);

		std::cout << "After : size of get area:	" << egptr() - eback()
       << '\n'
			  << "	      size of put area:	" << epptr() - pbase()
       << '\n';

		return ret;
	    }
	};

	int main()
	{
	    std::cout << "read-write stream:\n";
	    mybuf sbuf("   "); // read-write stream
	    std::iostream stream(&sbuf);
	    stream << 1234;
	    std::cout << sbuf.str() << '\n';

	    std::cout << "\nread-only stream:\n";
	    mybuf ro_buf("   ",	std::ios_base::in); // read-only stream
	    std::iostream ro_stream(&ro_buf);
	    ro_stream << 1234;

	    std::cout << "\nwrite-only stream:\n";
	    mybuf wr_buf("   ",	std::ios_base::out); //	write-only stream
	    std::iostream wr_stream(&wr_buf);
	    wr_stream << 1234;
	}

Possible output:
	read-write stream:
	stringbuf::overflow('4') called
	Before:	size of	get area: 3
		size of	put area: 3
	After :	size of	get area: 4
		size of	put area: 512
	1234

	read-only stream:
	stringbuf::overflow('1') called
	Before:	size of	get area: 3
		size of	put area: 0
	After :	size of	get area: 3
		size of	put area: 0

	write-only stream:
	stringbuf::overflow('4') called
	Before:	size of	get area: 0
		size of	put area: 3
	After :	size of	get area: 0
		size of	put area: 512

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	    DR	     Applied	to		   Behavior    as    published
       Correct behavior
	  LWG 169 C++98	     the buffer	 (re)allocated	could  only  hold  one
       allows more extra
			     extra				     character
       characters
			     overflow moved epptr() to point just past the
	  LWG		     432		C++98			   new
       it is not moved
			     write position if the std::stringbuf is open
			     for input

See also
	  overflow   writes  characters	to the associated output sequence from
       the put area
	  [virtual] (virtual protected member function	of  std::basic_stream-
       buf<CharT,Traits>)

	  underflow returns the	next character available in the	input sequence
	  [virtual] (virtual protected member function)

http://cppreference.com		  2024.06.10	  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_stringbuf::overflow&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help