Namespaces
Variants

std::basic_stringbuf<CharT,Traits,Allocator>:: overflow

From cppreference.net
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]
возвращает следующий доступный символ во входной последовательности
(виртуальная защищённая функция-член)