std::basic_streambuf<CharT,Traits>::overflow
来自 cppreference.cn
< 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() 的值。失败时返回 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 的虚保护成员函数) |