std::basic_streambuf<CharT,Traits>::overflow
来自cppreference.com
< cpp | io | basic streambuf
protected: virtual int_type overflow( int_type ch = Traits::eof()); | ||
正式而言,此函数确保放置区有至少一个字符的空间。基类版本始终会失败,只能在派生类中提供会成功的版本(见实现要求)。标准库提供了 std::strstreambuf::overflow()、(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() 或抛出异常。
[编辑]注解
sputc() 和 sputn() 在可能上溢的情况(pptr()== nullptr 或 pptr()>= 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";elsestd::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<<"流正常\n"; stream <<"world"; streambuf.print_buffer();if(stream.good())std::cout<<"流正常\n"; stream <<"!"; streambuf.print_buffer();if(!stream.good())std::cout<<"流异常\n";}
输出:
h e l l o \0 \0 \0 \0 \0 流正常 h e l l o w o r l d 流正常 overflow h e l l o w o r l d 流异常
[编辑]参阅
[虚] | 从输入序列读取字符到获取区,并推进下一位置指针 (虚受保护成员函数) |
[虚] | 从关联输入序列读取字符到获取区 (虚受保护成员函数) |
[虚] | 从放置区写字符到关联的文件 ( std::basic_filebuf<CharT,Traits> 的虚受保护成员函数) |
[虚] | 后附字符到输出序列 ( std::basic_stringbuf<CharT,Traits,Allocator> 的虚受保护成员函数) |
[虚] | 后附字符到输出序列,可能重分配或初始地分配缓冲区,若它为动态且未被冻结 ( std::strstreambuf 的虚受保护成员函数) |