命名空间
变体
操作

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

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

此函数的目的是将字符从流缓冲区的 [[cpp/io/basic_streambuf|放置区域]] 传输到 关联的字符序列

形式上,此函数确保在放置区域至少有一个字符的空间。基类版本总是失败,并且只有在派生类中才能提供可能成功的实现(参见 实现要求)。标准库提供了 std::strstreambuf::overflow(), (直到 C++26)std::basic_stringbuf::overflow()std::basic_filebuf::overflow()

目录

[编辑] 参数

ch - 要存储在放置区域的字符

[编辑] 返回值

Traits::eof()

[编辑] 实现要求

此虚函数的每个重写定义都必须遵守以下约束,否则行为未定义

  • 此函数的效果是消耗待处理序列的字符的初始子序列。待处理序列定义为以下序列的串联
    • 放置区域(形式上,如果 pbase() 为空则为空序列,否则为以 pbase() 开头的 (pptr() - pbase() 个字符)。
    • 字符 ch,如果 ch 是 EOF,则为空(形式上,如果 Traits::eq_int_type(ch, Traits::eof()) 返回 true)。
  • 消耗后,放置区域指针将被更新以保存剩余字符(如果有)。形式上,设 r 为待处理序列中未消耗的字符数
    • 如果 r 非零,则设置 pbase()pptr(),以便满足以下所有条件
      • pptr() - pbase()r
      • pbase() 开头的 r 个字符是关联的输出流。
    • 如果 r 为零(待处理序列的所有字符都已被消耗),则 pbase() 设置为 null 值,或者 pbase()pptr() 都设置为相同的非 null 值。
  • 如果向关联的输出流追加字符失败,或者如果无法根据上述规则建立 pbase()pptr(),则函数可能会失败。
  • 如果函数成功,则返回除 Traits::eof() 之外的某个值。通常,返回 ch 以指示成功,除非 Traits::eq_int_type(ch, Traits::eof()) 返回 true,在这种情况下,返回 Traits::not_eof(ch)
  • 如果函数失败,则返回 Traits::eof() 或抛出异常。

[编辑] 注意

sputc()sputn() 在溢出时(pptr() == nullptrpptr() >= epptr()) 调用此函数。

[编辑] 示例

#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 的虚函数,受保护的成员函数) [编辑]