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 .
streambuf.htm
Advertisements