std::basic_streambuf<CharT,Traits>::overflow
< cpp | io | basic streambuf
virtual int_type overflow( int_type ch = Traits::eof() ); |
||
通过保存始于 pbase() 的某个起始字符子序列到输入序列,并更新放置区(若需要),确保放置区有至少一个字符的空间。若 ch
不是 Traits::eof() (即 Traits::eq_int_type(ch, Traits::eof()) != true ),则将它放到放置区或直接保存到输出序列。
函数可以更新 pptr
、 epptr
和 pbase
指针以定义要写入更多数据的位置。失败时,函数确保 pptr() == nullptr 或 pptr() == epptr 。
函数的基类版本不做任何事。允许此函数的导出类版本在耗尽的情况下更新放置区。
参数
ch | - | 要存储于放置区的字符 |
返回值
成功时返回不等于 Traits::eof() 的未指定值,失败时返回 Traits::eof() 。
此函数的基类版本返回 Traits::eof() 。
注意
sputc() 和 sputn() 在可能上溢的情况( pptr() == nullptr 或 pptr() >= epptr() )下调用此函数。
示例
运行此代码
#include <iostream> #include <array> // 以 std::array 实现的 std::ostream 缓冲区 template<std::size_t SIZE, class CharT = char> class ArrayedStreamBuffer : public std::basic_streambuf<CharT> { public: using Base = std::basic_streambuf<CharT>; using char_type = typename Base::char_type; using int_type = typename Base::int_type; ArrayedStreamBuffer() : buffer_{} // 值初始化 buffer_ 为全零 { Base::setp(buffer_.begin(), buffer_.end()); // 设置 std::basic_streambuf // 放置区指针以 'buffer_' 工作 } int_type overflow(int_type ch) { std::cout << "overflow\n"; return Base::overflow(ch); } void print_buffer() { for (const auto& i: buffer_) { if (i == 0) { std::cout << "NULL"; } 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 NULL NULL NULL NULL NULL 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 的虚受保护成员函数) |