命名空间
变体
操作

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()

[编辑] 注意

如果发生溢出(pptr() == nullptrpptr() >= epptr()),sputc()sputn()会调用此函数。

[编辑] 示例

#include <array>
#include <cstddef>
#include <iostream>
 
// Buffer for std::ostream implemented by std::array
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()
    {
        // put area pointers to work with '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{}; // value-initialize 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 的虚拟受保护成员函数) [编辑]