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 <iostream>
	#include <sstream>

	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 <<	'\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 <<	'\n';
	}

Possible output:
	Before underflow(): get	area size is 3,	put area size is 15
	After underflow():  get	area size is 3,	put area size is 15
	underflow() returns EOF
	n = 123
	Before underflow(): get	area size is 3,	put area size is 15
	After underflow():  get	area size is 6,	put area size is 15
	underflow() returns '4'
	Before underflow(): get	area size is 6,	put area size is 15
	After underflow():  get	area size is 6,	put area size is 15
	underflow() returns EOF
	n = 456

	  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
			     it	was unclear whether characters appended	by
	  LWG		   432		    C++98		    overflow()
       made clear
			     are considered to be part of the input sequence

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		  2024.06.10	 std::basic_...f::underflow(3)

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

home | help