# std::basic_streambuf<CharT,Traits>::overflow

< cpp‎ | io‎ | basic streambuf

virtual int_type overflow( int_type ch = Traits::eof() ); |  |

通过保存始于 pbase() 的某个起始字符子序列到输入序列，并更新放置区（若需要），确保放置区有至少一个字符的空间。若 `ch` 不是 Traits::eof() （即 Traits::eq_int_type(ch, Traits::eof()) != true ），则将它放到放置区或直接保存到输出序列。

函数可以更新 `pptr` 、 `epptr` 和 `pbase` 指针以定义要写入更多数据的位置。失败时，函数确保 pptr() == nullptr 或 pptr() == epptr 。

函数的基类版本不做任何事。允许此函数的导出类版本在耗尽的情况下更新放置区。

### 参数

ch | - | 要存储于放置区的字符

### 返回值

成功时返回不等于 Traits::eof() 的未指定值，失败时返回 Traits::eof() 。

此函数的基类版本返回 Traits::eof() 。

### 注意

sputc() 和 sputn() 在可能上溢的情况（ pptr() == nullptr 或 pptr() >= epptr() ）下调用此函数。

### 示例

    #include <iostream>
    #include <array>

    // 以 std::array 实现的 std::ostream 缓冲区
    template<std::size_t SIZE, class CharT = char>
    class ArrayedStreamBuffer : public std::basic_streambuf<CharT> {
    public:

        using Base = std::basic_streambuf<CharT>;
        using char_type = typename Base::char_type;
        using int_type = typename Base::int_type;

        ArrayedStreamBuffer() : buffer_{} // 值初始化 buffer_ 为全零
        {
            Base::setp(buffer_.begin(), buffer_.end()); // 设置 std::basic_streambuf
                // 放置区指针以 'buffer_' 工作
        }

        int_type overflow(int_type ch)
        {
            std::cout << "overflow\n";
            return Base::overflow(ch);
        }

        void print_buffer()
        {
            for (const auto& i: buffer_) {
                if (i == 0) {
                    std::cout << "NULL";
                } else {
                    std::cout << i;
                }
                std::cout << " ";
            }
            std::cout << "\n";
        }

    private:
        std::array<char_type, SIZE> 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 NULL NULL NULL NULL NULL
    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

### 参阅

uflow [虚] | 从输入序列读取字符到获取区，并令下一位置指针前进 (虚受保护成员函数)
underflow [虚] | 从关联输入序列读取字符到获取区 (虚受保护成员函数)
overflow [虚] | 从放置区写字符到关联的文件 (`std::basic_filebuf<CharT,Traits>` 的虚受保护成员函数)
overflow [虚] | 后附字符到输出序列 (`std::basic_stringbuf<CharT,Traits,Allocator>` 的虚受保护成员函数)
overflow [虚] | 后附字符到输出序列，可能重分配或初始地分配缓冲区，若它为动态且未被冻结 (`std::strstreambuf` 的虚受保护成员函数)