std::basic_streambuf<CharT,Traits>::overflow
来自 cppreference.com
< cpp | io | basic streambuf
protected: 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()。
[编辑] 注意
如果发生溢出(pptr() == nullptr或pptr() >= epptr()),sputc()和sputn()会调用此函数。
[编辑] 示例
运行此代码
#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 的虚拟受保护成员函数) |