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

来自cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
protected:
virtual int_type overflow( int_type ch = Traits::eof() );

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

函数可以更新 pptrepptrpbase 指针以定义要写入更多数据的位置。失败时,函数确保 pptr() == nullptrpptr() == epptr

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

参数

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

返回值

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

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

注解

sputc()sputn() 在可能上溢的情况(pptr() == nullptrpptr() >= epptr())下调用此函数。

示例

#include <array>
#include <cstddef>
#include <iostream>
 
// 以 std::array 实现的 std::ostream 缓冲区
template<std::size_t size, class CharT = char>
struct ArrayedStreamBuffer : std::basic_streambuf<CharT>
{
    using Base = std::basic_streambuf<CharT>;
    using char_type = typename Base::char_type;
    using int_type = typename Base::int_type;
 
    ArrayedStreamBuffer()
    {
        // 设置 std::basic_streambuf 放置区指针以 'buffer_' 工作
        Base::setp(buffer.data(), buffer.data() + size);
    }
 
    int_type overflow(int_type ch) 
    {
        std::cout << "overflow\n";
        return Base::overflow(ch);
    }
 
    void print_buffer()
    {
         for (char_type i : buffer)
        {
            if (i == 0)
                std::cout << "\\0";
            else
                std::cout << i;
            std::cout << ' ';
        }
        std::cout << '\n';
    }
 
private:
    std::array<char_type, size> buffer{}; // 值初始化 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 \0 \0 \0 \0 \0
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

参阅

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