std::strstreambuf::overflow
protected: virtual int_type overflow( int_type c = EOF ); | (устарело в C++98) (удалено в C++26) |
Добавляет символ c в область записи буфера, при возможности выполняя перераспределение памяти.
1) Если
c == EOF, ничего не делает.
2) В противном случае, если в области записи доступна позиция для записи (
pptr() < epptr()), сохраняет символ, как если бы был вызван *pptr()++ = c.
3) В противном случае, если режим буфера потока не является динамическим или буфер потока в данный момент заморожен, функция завершается с ошибкой и возвращает
EOF.
4) В противном случае функция перераспределяет память (или первоначально выделяет её) для динамического массива, достаточно большого, чтобы вместить содержимое текущего динамического массива (если он есть) и как минимум одну дополнительную позицию для записи. Если в конструкторе был использован указатель на функцию выделения памяти
palloc, эта функция вызывается с аргументом (*palloc)(n), где n — количество байтов для выделения; в противном случае используется new char[n]. Если в конструкторе был использован указатель на функцию освобождения памяти pfree, эта функция вызывается с аргументом (*pfree)(p) для освобождения предыдущего массива, если это необходимо; в противном случае используется delete[] p. Если выделение памяти завершается неудачей, функция завершается с ошибкой и возвращает EOF. Параметры
| c | - | символ для сохранения в области записи |
Возвращаемое значение
Если c == EOF, возвращает значение, отличное от EOF. В противном случае при успехе возвращает (unsigned char)(c), а при ошибке — EOF.
Пример
#include <iostream>
#include <strstream>
struct mybuf : std::strstreambuf
{
int_type overflow(int_type c)
{
std::cout << "Before overflow(): size of the put area is " << epptr()-pbase()
<< " with " << epptr()-pptr() << " write positions available\n";
int_type rc = std::strstreambuf::overflow(c);
std::cout << "After overflow(): size of the put area is " << epptr()-pbase()
<< " with " << epptr()-pptr() << " write positions available\n";
return rc;
}
};
int main()
{
mybuf sbuf; // read-write dynamic strstreambuf
std::iostream stream(&sbuf);
stream << "Sufficiently long string to overflow the initial allocation, at least "
<< " on some systems.";
}
Возможный вывод:
Before overflow(): size of the put area is 16 with 0 write positions available After overflow(): size of the put area is 32 with 15 write positions available Before overflow(): size of the put area is 32 with 0 write positions available After overflow(): size of the put area is 64 with 31 write positions available Before overflow(): size of the put area is 64 with 0 write positions available After overflow(): size of the put area is 128 with 63 write positions available
См. также
|
[виртуальная] | записывает символы из области записи в связанную выходную последовательность (виртуальная защищённая функция-член класса std::basic_streambuf<CharT,Traits>) |
|
[виртуальная] | добавляет символ в выходную последовательность (виртуальная защищённая функция-член класса std::basic_stringbuf<CharT,Traits,Allocator>) |
|
[виртуальная] | записывает символы из области записи в связанный файл (виртуальная защищённая функция-член класса std::basic_filebuf<CharT,Traits>) |
| записывает один символ в область записи и перемещает указатель на следующий символ (открытая функция-член класса std::basic_streambuf<CharT,Traits>) |
|
| вставляет символ (открытая функция-член класса std::basic_ostream<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/strstreambuf/overflow