std::basic_streambuf<CharT,Traits>::overflow
protected: virtual int_type overflow( int_type ch = Traits::eof() ); |
Назначение этой функции — передавать символы из области записи буфера потока в связанную последовательность символов.
Формально эта функция гарантирует, что в области записи есть место как минимум для одного символа. Версия базового класса всегда завершается неудачей, а реализация, которая может завершиться успешно, может быть предоставлена только в производных классах (см. требования к реализации). Стандартная библиотека предоставляет std::strstreambuf::overflow(), (до C++26)std::basic_stringbuf::overflow() и std::basic_filebuf::overflow().
Параметры
| ch | - | символ, который нужно сохранить в области записи |
Возвращаемое значение
Traits::eof()
Требования к реализации
Каждое переопределение этой виртуальной функции должно удовлетворять следующим ограничениям; в противном случае поведение не определено:
- Функция потребляет некоторую начальную подпоследовательность символов ожидающей последовательности . Ожидающая последовательность определяется как конкатенация следующих последовательностей:
- После потребления указатели области записи обновляются так, чтобы указывать на оставшиеся символы, если таковые имеются. Формально, пусть
r— количество непотреблённых символов ожидающей последовательности:- Если
rне равен нулю, тоpbase()иpptr()устанавливаются так, чтобы выполнялись все следующие условия:-
pptr() - pbase()равенr. rсимволов, начиная сpbase(), составляют связанный выходной поток.
-
- Если
rравен нулю (все символы ожидающей последовательности потреблены), то либоpbase()устанавливается в нулевое значение, либоpbase()иpptr()устанавливаются в одно и то же ненулевое значение.
- Если
- Функция может завершиться неудачей, если добавление какого-либо символа в связанный выходной поток завершается неудачей или если она не может установить
pbase()иpptr()в соответствии с приведёнными выше правилами. - Если функция завершается успешно, она возвращает значение, отличное от
Traits::eof(). Обычно для обозначения успеха возвращаетсяch, за исключением случая, когдаTraits::eq_int_type(ch, Traits::eof())возвращаетtrue; в этом случае возвращаетсяTraits::not_eof(ch). - Если функция завершается неудачей, она возвращает
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>
struct ArrayedStreamBuffer : std::basic_streambuf<CharT>
{
using Base = std::basic_streambuf<CharT>;
using char_type = typename Base::char_type;
using int_type = typename Base::int_type;
ArrayedStreamBuffer()
{
// put area pointers to work with 'buffer'
Base::setp(buffer.data(), buffer.data() + size);
}
int_type overflow(int_type ch)
{
std::cout << "overflow\n";
return Base::overflow(ch);
}
void print_buffer()
{
for (char_type i : buffer)
{
if (i == 0)
std::cout << "\\0";
else
std::cout << i;
std::cout << ' ';
}
std::cout << '\n';
}
private:
std::array<char_type, size> buffer{}; // value-initialize 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
См. также
|
[виртуальная] | считывает символы из связанной входной последовательности в область чтения и перемещает указатель на следующую позицию (виртуальная защищённая функция-член) |
|
[виртуальная] | считывает символы из связанной входной последовательности в область чтения (виртуальная защищённая функция-член) |
|
[виртуальная] | записывает символы из области записи в связанный файл (виртуальная защищённая функция-член класса std::basic_filebuf<CharT,Traits>) |
|
[виртуальная] | добавляет символ в выходную последовательность (виртуальная защищённая функция-член класса std::basic_stringbuf<CharT,Traits,Allocator>) |
|
[виртуальная] | добавляет символ в выходную последовательность; может перераспределить память или изначально выделить буфер, если он динамический и не заморожен (виртуальная защищённая функция-член класса std::strstreambuf) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_streambuf/overflow