名前空間
変種
操作

std::basic_streambuf::overflow

提供: cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
virtual int_type overflow( int_type ch = Traits::eof() );

pbase() から始まる文字シーケンスの先頭部分をいくらか出力シーケンスに保存し、 put 領域のポインタを更新する (必要であれば) ことによって、 put 領域に少なくとも1文字の空間があることを保証します。 chTraits::eof() でなければ (すなわち Traits::eq_int_type(ch, Traits::eof()) != true であれば)、それは put 領域に置かれるか、出力シーケンスに直接保存されます。

この関数はさらなるデータを書き込むための位置を定義するために pptrepptr および pbase を更新するかもしれません。 失敗した場合、この関数は pptr() == nullptr または pptr() == epptr であることを保証します。

この関数の基底クラスのバージョンは何もしません。 派生クラスは使い切った場合に put 領域を更新できるようにこの関数をオーバーライドするかもしれません

目次

[編集] 引数

ch - put 領域に格納する文字

[編集] 戻り値

成功した場合は Traits::eof() と等しくない未規定な値を返します。 失敗した場合は Traits::eof() を返します。

この関数の基底クラスのバージョンは Traits::eof() を返します。

[編集] ノート

sputc() および sputn() はこの関数をオーバーフロー (pptr() == nullptr または pptr() >= epptr()) の場合にだけ呼びます。

[編集]

#include <iostream>
#include <array>
 
// Buffer for std::ostream implemented by std::array
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_{} // value-initialize buffer_ to all zeroes
    {
        Base::setp(buffer_.begin(), buffer_.end()); // set std::basic_streambuf
            // put area pointers to work with '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

[編集] 関連項目

[仮想]
紐付けられている入力シーケンスから get 領域に文字を読み込み、次ポインタを進めます
(仮想プロテクテッドメンバ関数) [edit]
[仮想]
紐付けられている入力シーケンスから get 領域に文字を読み込みます
(仮想プロテクテッドメンバ関数) [edit]
[仮想]
put 領域から紐付けられているファイルに文字を書き込みます
(std::basic_filebufの仮想プロテクテッドメンバ関数) [edit]
[仮想]
出力シーケンスに文字を追加します
(std::basic_stringbufの仮想プロテクテッドメンバ関数) [edit]
[仮想]
出力シーケンスに文字を追加します。 動的な場合、または凍結されていない場合、バッファを再確保または初期確保することがあります
(std::strstreambufの仮想プロテクテッドメンバ関数) [edit]