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