std::basic_streambuf<CharT,Traits>:: overflow
| 
           
            
             protected
            
            
             :
            
             virtual int_type overflow ( int_type ch = Traits :: eof ( ) ) ; | ||
此函数的目的是将字符从流缓冲区的 放置区 传输到 关联字符序列 。
正式而言,此函数确保放置区域至少有一个字符的空间。基类版本始终失败,可能成功的实现仅能在派生类中提供(参见 实现要求 )。标准库提供了 std::strstreambuf::overflow() , (until C++26) std::basic_stringbuf::overflow() 和 std::basic_filebuf::overflow() 。
| 目录 | 
参数
| ch | - | 要存储到放置区域的字符 | 
返回值
Traits :: eof ( )
实现要求
此虚函数的每个重写定义都必须遵循以下约束,否则行为未定义:
- 该函数的作用是消耗 待处理序列  字符的某个初始子序列。待处理序列定义为以下序列的串联:
- 消耗后,放置区指针将被更新以保存剩余字符(若有)。形式化定义:令 r 表示待处理序列中未被消耗的字符数:
- 若向关联输出流追加字符失败,或无法根据上述规则设置 pbase() 和 pptr() ,则函数可能失败。
- 若函数成功,则返回除 Traits :: eof ( ) 外的某个值。通常返回 ch 表示成功,除非 Traits :: eq_int_type ( ch, Traits :: eof ( ) ) 返回 true ,此时返回 Traits :: not_eof ( ch ) 。
- 若函数失败,则返回 Traits :: eof ( ) 或抛出异常。
注释
当发生溢出时( pptr ( ) == nullptr 或 pptr ( ) >= epptr ( ) ), sputc() 和 sputn() 会调用此函数。
示例
#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() { // 设置输出区域指针以操作 '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{}; // 值初始化缓冲区 }; 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
参见
| 
           
            
             
              [virtual]
             
            
           
           | 从关联输入序列读取字符到获取区并推进下一个指针 (虚函数保护成员函数) | 
| 
           
            
             
              [virtual]
             
            
           
           | 从关联输入序列读取字符到获取区 (虚函数保护成员函数) | 
| 
           
            
             
              [virtual]
             
            
           
           | 将字符从放置区写入关联文件 ( 
           std::basic_filebuf<CharT,Traits>
          的虚函数保护成员函数) | 
| 
           
            
             
              [virtual]
             
            
           
           | 向输出序列追加字符 ( 
           std::basic_stringbuf<CharT,Traits,Allocator>
          的虚函数保护成员函数) | 
| 
           
            
             
              [virtual]
             
            
           
           | 向输出序列追加字符,若为动态缓冲区且未冻结则可能重新分配或首次分配缓冲区 ( 
           std::strstreambuf
          的虚函数保护成员函数) |