Spec-Zone.ru › C++

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

protected:
virtual int_type overflow( int_type ch = Traits::eof() );

Обеспечивает наличие места в области записи для как минимум одного символа, сохраняя некоторую начальную последовательность символов, начиная с pbase() в выходной последовательности и обновляя указатели на область записи (при необходимости). Если ch не является Traits::eof() (т.е. Traits::eq_int_type(ch, Traits::eof()) != true), он либо помещается в область записи, либо сохраняется непосредственно в выходной последовательности.

Функция может обновить pptr, epptr и pbase указатели, чтобы определить место для записи дополнительных данных. При ошибке функция гарантирует, что либо pptr() == nullptr или pptr() == epptr.

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

Параметры

ch - символ для хранения в области записи

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

Возвращает неуказанное значение, отличное от Traits::eof() при успехе, Traits::eof() при ошибке.

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

Примечание

sputc() и sputn() вызывают эту функцию в случае переполнения (pptr() == nullptr или pptr() >= epptr()).

Пример

#include <array>
#include <cstddef>
#include <iostream>
 
// Buffer for std::ostream implemented by std::array
template<std::size_t SIZE, class CharT = char>
class ArrayedStreamBuffer : public std::basic_streambuf<CharT>
{
public:
    using Base = std::basic_streambuf<CharT>;
    using char_type = typename Base::char_type;
    using int_type = typename Base::int_type;
 
    ArrayedStreamBuffer() : buffer_{} // value-initialize buffer_ to all zeroes
    {
        Base::setp(buffer_.begin(), buffer_.end()); // set std::basic_streambuf
            // put area pointers to work with 'buffer_'
    }
 
    int_type overflow(int_type ch) 
    {
        std::cout << "overflow\n";
        return Base::overflow(ch);
    }
 
    void print_buffer()
    {
        for (const auto& i : buffer_)
        {
            if (i == 0)
                std::cout << "\\0";
            else
                std::cout << i;
            std::cout << ' ';
        }
        std::cout << '\n';
    }
 
private:
    std::array<char_type, SIZE> buffer_;
};
 
int main()
{
    ArrayedStreamBuffer<10> streambuf;
    std::ostream stream(&streambuf);
 
    stream << "hello";
    streambuf.print_buffer();
    if (stream.good())
        std::cout << "stream is good\n";
 
    stream << "world";
    streambuf.print_buffer();
    if (stream.good())
        std::cout << "stream is good\n";
 
    stream << "!";
    streambuf.print_buffer();
    if (!stream.good())
        std::cout << "stream is not good\n";
}

Вывод:

h e l l o \0 \0 \0 \0 \0
stream is good
h e l l o w o r l d 
stream is good
overflow
h e l l o w o r l d 
stream is not good

См. также

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

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

Spec-Zone.ru

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