std::basic_stringbuf<CharT,Traits,Allocator>:: overflow
|
protected
:
virtual int_type overflow ( int_type c = Traits :: eof ( ) ) ; |
||
Добавляет символ c в выходную последовательность символов.
Если c является индикатором конца файла ( traits :: eq_int_type ( c, traits :: eof ( ) ) == true ), то не существует символа для добавления. Функция ничего не делает и возвращает неопределенное значение, отличное от traits :: eof ( ) .
В противном случае, если выходная последовательность имеет доступную позицию записи или эта функция может успешно сделать позицию записи доступной, то вызывается sputc ( c ) и возвращается c .
Эта функция может сделать доступной позицию записи, если
std::stringbuf
открыт для вывода (
(
mode
&
ios_base
::
out
)
!
=
0
): в этом случае она перераспределяет (или изначально выделяет) буфер достаточного размера, чтобы вместить весь текущий буфер плюс как минимум один дополнительный символ. Если
std::stringbuf
также открыт для ввода (
(
mode
&
ios_base
::
in
)
!
=
0
), тогда
overflow
также увеличивает размер области получения путем перемещения
egptr()
на позицию сразу после новой позиции записи.
Содержание |
Параметры
| c | - | символ для сохранения в области вывода |
Возвращаемое значение
Traits :: eof ( ) для указания неудачи, c если символ c был успешно добавлен, или другое значение, отличное от Traits :: eof ( ) если вызвано с Traits :: eof ( ) в качестве аргумента.
Примечания
Эта функция отличается от типичной
overflow()
, которая перемещает содержимое буфера в связанную символьную последовательность, потому что для
std::basic_stringbuf
буфер и связанная последовательность являются одним и тем же.
Пример
В реализации, используемой для выполнения этого примера (например, GCC-4.9),
overflow()
перераспределяет область вывода до 512 байт: вызов
str()
вернул бы только четыре инициализированных байта, но следующие 508 вызовов
sputc()
не потребовали бы новых вызовов
overflow()
.
#include <sstream> #include <iostream> struct mybuf : std::stringbuf { mybuf(const std::string& new_str, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out) : std::stringbuf(new_str, which) {} int_type overflow(int_type c = EOF) override { std::cout << "stringbuf::overflow('" << char(c) << "') called\n" << "Before: size of get area: " << egptr() - eback() << '\n' << " size of put area: " << epptr() - pbase() << '\n'; int_type ret = std::stringbuf::overflow(c); std::cout << "After : size of get area: " << egptr() - eback() << '\n' << " size of put area: " << epptr() - pbase() << '\n'; return ret; } }; int main() { std::cout << "read-write stream:\n"; mybuf sbuf(" "); // read-write stream std::iostream stream(&sbuf); stream << 1234; std::cout << sbuf.str() << '\n'; std::cout << "\nread-only stream:\n"; mybuf ro_buf(" ", std::ios_base::in); // read-only stream std::iostream ro_stream(&ro_buf); ro_stream << 1234; std::cout << "\nwrite-only stream:\n"; mybuf wr_buf(" ", std::ios_base::out); // write-only stream std::iostream wr_stream(&wr_buf); wr_stream << 1234; }
Возможный вывод:
read-write stream:
stringbuf::overflow('4') called
Before: size of get area: 3
size of put area: 3
After : size of get area: 4
size of put area: 512
1234
read-only stream:
stringbuf::overflow('1') called
Before: size of get area: 3
size of put area: 0
After : size of get area: 3
size of put area: 0
write-only stream:
stringbuf::overflow('4') called
Before: size of get area: 0
size of put area: 3
After : size of get area: 0
size of put area: 512
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 169 | C++98 | the buffer (re)allocated could only hold one extra character | allows more extra characters |
| LWG 432 | C++98 |
overflow
moved
epptr()
to point just past the new
write position if the
std::stringbuf
is open for input
|
it is not moved |
Смотрите также
|
[virtual]
|
записывает символы в связанную выходную последовательность из области вывода
(виртуальная защищённая функция-член
std::basic_streambuf<CharT,Traits>
)
|
|
[virtual]
|
возвращает следующий доступный символ во входной последовательности
(виртуальная защищённая функция-член) |