CppDS.com

C++ 98 11 14 17 20 手册

std::basic_streambuf<CharT,Traits>::overflow

来自cppreference.com
< 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 ),则将它放到放置区或直接保存到输出序列。

函数可以更新 pptrepptrpbase 指针以定义要写入更多数据的位置。失败时,函数确保 pptr() == nullptrpptr() == epptr

函数的基类版本不做任何事。允许此函数的导出类版本在耗尽的情况下更新放置区。

参数

ch - 要存储于放置区的字符

返回值

成功时返回不等于 Traits::eof() 的未指定值,失败时返回 Traits::eof()

此函数的基类版本返回 Traits::eof()

注意

sputc()sputn() 在可能上溢的情况( pptr() == nullptrpptr() >= 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 的虚受保护成员函数)
关闭