Spec-Zone.ru › C++

std::basic_streambuf<CharT,Traits>::underflow

protected:
virtual int_type underflow();

Обеспечивает доступность как минимум одного символа в области ввода, обновляя указатели области ввода (если необходимо) и считывая дополнительные данные из входной последовательности (если применимо). В случае успеха возвращает значение этого символа (преобразованное в int_type с помощью Traits::to_int_type(c)), а в случае неудачи — Traits::eof().

Функция может обновлять указатели gptr, egptr и eback, чтобы определить расположение вновь загруженных данных (если они есть). В случае неудачи функция гарантирует, что либо gptr() == nullptr, либо gptr() == egptr.

Версия функции базового класса ничего не делает. Производные классы могут переопределить эту функцию, чтобы разрешить обновление области чтения при её исчерпании.

Параметры

(нет)

Возвращаемое значение

Значение символа, на который указывает указатель чтения после вызова в случае успеха, или Traits::eof() в противном случае.

Версия функции базового класса возвращает traits::eof().

Примечание

Открытые функции std::streambuf вызывают эту функцию только в том случае, если gptr() == nullptr или gptr() >= egptr().

Пример

#include <iostream>
#include <sstream>

class null_filter_buf : public std::streambuf
{
    std::streambuf* src;
    char ch; // single-byte buffer
protected:
    int underflow()
    {
        traits_type::int_type i;
        while ((i = src->sbumpc()) == '\0')
            ; // skip zeroes
        if (!traits_type::eq_int_type(i, traits_type::eof()))
        {
            ch = traits_type::to_char_type(i);
            setg(&ch, &ch, &ch+1); // make one read position available
        }
        return i;
    }
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);
}

Вывод:

This is an example

См. также

uflow
[виртуальная]
считывает символы из связанной входной последовательности в область чтения и перемещает указатель чтения
(виртуальная защищённая функция-член)
overflow
[виртуальная]
записывает символы из области записи в связанную выходную последовательность
(виртуальная защищённая функция-член)
underflow
[виртуальная]
считывает данные из связанного файла
(виртуальная защищённая функция-член std::basic_filebuf<CharT,Traits>)
underflow
[виртуальная]
возвращает следующий доступный символ во входной последовательности
(виртуальная защищённая функция-член std::basic_stringbuf<CharT,Traits,Allocator>)
underflow
[виртуальная]
считывает символ из входной последовательности, не перемещая указатель чтения
(виртуальная защищённая функция-член std::strstreambuf)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_streambuf/underflow

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API