Namespaces
Variants
Views
Actions

std::basic_streambuf::underflow

From cppreference.com
< cpp‎ | io‎ | basic streambuf
Revision as of 19:53, 2 November 2012 by P12bot (Talk | contribs)

 
 
 
 
int_type underflow();

Ensures that at least one character is available in the input area by updating the pointers to the input area (if needed). Returns the value of that character on success or traits::eof() on failure.

The function may update gptr, egptr and eback pointers to define the location of newly loaded data (if any). On failure, the function ensures that either gptr() == nullptr or gptr() == egptr.

The base class version of the function does nothing. The derived classes may override this function to allow updates to the get area in the case of exhaustion.

Contents

Parameters

(none)

Return value

The value of the character pointed to by the get pointer after the call on success, or traits::eof() otherwise.

The base class version of the function calls traits::eof().

Note

The public functions of std::streambuf call this function only if gptr() == nullptr or gptr() >= egptr().

Example

#include <iostream>
#include <sstream>
 
class null_filter_buf : public std::streambuf {
    std::streambuf* src;
    char ch; // single-byte buffer
protected:
    int underflow() {
        while( (ch= src->sbumpc()) == '\0') ; // skip zeroes
        setg(&ch, &ch, &ch+1); // make one read position available
        return ch; // may return EOF
    }
public:
    null_filter_buf(std::streambuf* buf) : src(buf) {
        setg(&ch, &ch+1, &ch+1); // buffer is initially full
    }
};
 
void filtered_read(std::istream& in)
{
    std::streambuf* orig = in.rdbuf();
    null_filter_buf buf(orig);
    in.rdbuf(&buf);
    for(char c; in.get(c); )
            std::cout << c;
    in.rdbuf(orig);
}
 
int main()
{
    char a[] = "This i\0s \0an e\0\0\0xample";
    std::istringstream in(std::string(std::begin(a), std::end(a)));
    filtered_read(in);
}

Output:

This is an example

See also

Template:cpp/io/basic streambuf/dcl list uflowTemplate:cpp/io/basic streambuf/dcl list overflow