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()
[编辑] 实现要求
此虚函数的每个重写定义都必须遵守以下约束,否则行为未定义
- 此函数的效果是消耗待处理序列的字符的初始子序列。待处理序列定义为以下序列的串联
- 消耗后,放置区域指针将被更新以保存剩余字符(如果有)。形式上,设 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> // 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 的虚函数,受保护的成员函数) |