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

FreeBSD Manual Pages

  
 
  

home | help
std::basic_...f::underflow(3) C++ Standard Libarystd::basic_...f::underflow(3)

NAME
       std::basic_stringbuf::underflow - std::basic_stringbuf::underflow

Synopsis
	  protected:
	  virtual int_type underflow()

	  Reads	the next character from	the get	area of	the buffer.

	  Specifically:

	  1)  If  the  input sequence has a read position available (egptr() >
       gptr()),	returns
	  Traits::to_int_type(*gptr())
	  2) Otherwise,	if pptr() > egptr()  (some  characters	were  inserted
       into the	stream
	  since	the last time overflow() changed egptr()) then extends the end
       of the get area
	  to  include  the  most recently inserted characters, by changing eg-
       ptr() to	equal
	  pptr(), and then returns Traits::to_int_type(*gptr())
	  3) Otherwise,	returns	Traits::eof().

	  Any character	in the buffer which has	been  initialized,  regardless
       of whether it
	  originated from the string passed in the constructor or was appended
       by overflow(),
	  is considered	to be part of the input	sequence.

Parameters
	  (none)

Return value
	  Traits::to_int_type(*gptr())	(the next character to read in the get
       area) in	case of
	  success, or Traits::eof() in case of failure.

Example
       // 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) {
		std::cout  <<  "Before	overflow():  get area size is "	<< eg-
       ptr()-eback() <<	' '
			  << " the put area size is "  <<  epptr()-pbase()  <<
       '\n';
		int_type rc = std::stringbuf::overflow(c);
		std::cout  <<  "After  overflow():  get	 area size is "	<< eg-
       ptr()-eback() <<	' '
			  << " put area	size is	" << epptr()-pbase() <<	'\n';
		return rc;
	    }

	    int_type underflow() {
		std::cout << "Before underflow(): get area size	is  "  <<  eg-
       ptr()-eback() <<	' '
			  << " put area	size is	" << epptr()-pbase() <<	'\n';
		int_type ch = std::stringbuf::underflow();
		std::cout  <<  "After  underflow():  get area size is "	<< eg-
       ptr()-eback() <<	' '
			  << " put area	size is	" << epptr()-pbase() <<	'\n';
		if(ch == EOF)
		    std::cout << "underflow() returns EOF\n";
		else
		    std::cout << "underflow() returns '" << char(ch) <<	"'\n";
		return ch;
	    }
	};

	int main()
	{
	    mybuf sbuf("123"); // read-write stream
	    std::iostream stream(&sbuf);
	    int	n;
	    stream >> n; // calls sgetc() four times
			 // three calls	return the characters '1', '2',	'3'
			 // the	fourth call, gptr() == egptr() and underflow()
       is called
			 // underflow returns EOF
	    std::cout << n << '\n';
	    stream.clear(); // clear the eofbit

	    stream << "123456";	// sputc() is called 6 times
				// first three calls store "123" in the	exist-
       ing buffer
				// 4th call finds that pptr() ==  epptr()  and
       calls overflow()
				//  overflow()	grows  the buffer and sets eg-
       ptr() to	4
				// 5th and 6th calls store '5'	and  '6',  ad-
       vancing pptr()
	    stream >> n; // calls sgetc() 4 times
			 //  1st  call returns the '4' that was	made available
       by overflow()
			 // on the 2nd call, egptr()  ==  egptr()  and	under-
       flow() is called
			 //  underflow advances	egptr()	to equal pptr()	(which
       is 6)
			 // 3rd	sgetc()	returns	'6'
			 // 4th	sgetc()	finds gptr() ==	egptr(), calls	under-
       flow()
			 // underflow()	returns	EOF
	    std::cout << n << '\n';
	}

Possible output:
	Before underflow(): get	area size is 3	put area size is 3
	After underflow(): get area size is 3  put area	size is	3
	underflow() returns EOF
	123
	Before overflow(): get area size is 3  the put area size is 3
	After overflow(): get area size	is 4  put area size is 35
	Before underflow(): get	area size is 4	put area size is 35
	After underflow(): get area size is 6  put area	size is	35
	underflow() returns '5'
	Before underflow(): get	area size is 6	put area size is 35
	After underflow(): get area size is 6  put area	size is	35
	underflow() returns EOF
	456

See also
	  underflow reads characters from the associated input sequence	to the
       get area
	  [virtual]  (virtual  protected member	function of std::basic_stream-
       buf<CharT,Traits>)
	  underflow reads from the associated file
	  [virtual] (virtual protected	member	function  of  std::basic_file-
       buf<CharT,Traits>)
	  underflow  reads a character from the	input sequence without advanc-
       ing the next
	  [virtual] pointer
		    (virtual protected member function of std::strstreambuf)
	  sgetc	    reads one character	from the input	sequence  without  ad-
       vancing the sequence
		    (public	member	  function    of    std::basic_stream-
       buf<CharT,Traits>)

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

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

home | help