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 | Применено к | Поведение, опубликованное ранее | Корректное поведение |
|---|---|---|---|
| LWG 169 | C++98 | перевыделенный буфер мог содержать только один дополнительный символ | разрешает больше дополнительных символов |
| LWG 432 | C++98 |
overflow передвигал epptr() на позицию сразу за новойпозицией записи, если std::stringbuf открыт для ввода | он не передвигается |
См. также
|
[virtual] | записывает символы в ассоциированную выходную последовательность из области записи (виртуальная защищённая функция-член std::basic_streambuf<CharT,Traits>) |
|
[virtual] | возвращает следующий доступный символ в входной последовательности (виртуальная защищённая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_stringbuf/overflow