|
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 egptr()
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #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 " << egptr()-eback() << ' ' << " the put area size is " << epptr()-pbase() << '\n' ; int_type rc = std::stringbuf::overflow(c); std::cout << "After overflow(): get area size is " << egptr()-eback() << ' ' << " put area size is " << epptr()-pbase() << '\n' ; return rc; } int_type underflow() { std::cout << "Before underflow(): get area size is " << egptr()-eback() << ' ' << " put area size is " << epptr()-pbase() << '\n' ; int_type ch = std::stringbuf::underflow(); std::cout << "After underflow(): get area size is " << egptr()-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 existing buffer // 4th call finds that pptr() == epptr() and calls overflow() // overflow() grows the buffer and sets egptr() to 4 // 5th and 6th calls store '5' and '6', advancing 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 underflow() is called // underflow advances egptr() to equal pptr() (which is 6) // 3rd sgetc() returns '6' // 4th sgetc() finds gptr() == egptr(), calls underflow() // underflow() returns EOF std::cout << n << '\n' ; } |
Possible output:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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
[virtual] | reads characters from the associated input sequence to the get area (virtual protected member function of std::basic_streambuf ) |
[virtual] | reads from the associated file (virtual protected member function of std::basic_filebuf ) |
[virtual] | reads a character from the input sequence without advancing the next pointer (virtual protected member function of std::strstreambuf ) |
reads one character from the input sequence without advancing the sequence (public member function of std::basic_streambuf ) |
Please login to continue.