C++ streambuf::underflow() function
The C++ std::streambuf::underflow() function is invoked when the input sequence is exhausted, meaning there are no more characters available to read. It attempts to re-fetch the characters into the buffer without advancing the current position, making them available for input operations.
By default, the underflow() function returns traits_type::eof() to indicates the failure.
Syntax
Following is the syntax for std::streambuf::underflow() function.
int underflow();
Parameters
It does not accepts any parameter.
Return Value
It returns the character at the current get pointer position (gptr), if one is available. Otherwise it returns the end-of-file value.
Exceptions
If an exception is thrown, the object is in a valid state.
Data races
It accesses the basic_stringbuf object.
Example 1
Let's look at the following example, where we are going to check the underflow on the empty buffer.
#include <iostream>
#include <streambuf>
class a: public std::streambuf {
protected: int_type underflow() override {
return traits_type::eof();
}
};
int main() {
a buf;
std::istream input( & buf);
char x;
if (!input.get(x)) {
std::cout << "underflow Detected.\n";
}
}
Output
Output of the above code is as follows −
underflow Detected.
Example 2
Consider the following example, where we are going to reuse the buffer by resetting the get pointer in the underflow() function.
#include <iostream>
#include <streambuf>
class x: public std::streambuf {
char data[10] = "WELCOME ";
protected:
int_type underflow() override {
if (gptr() == egptr()) {
setg(data, data, data + 9);
}
return traits_type::to_int_type( * gptr());
}
};
int main() {
x y;
std::istream input( & y);
for (int a = 0; a < 18; ++a) {
char c;
input.get(c);
std::cout << c;
}
}
Output
Following is the output of the above code −
WELCOME .WELCOME .