Namespaces
Variants

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

From cppreference.net
protected :
virtual int_type overflow ( int_type ch = Traits :: eof ( ) ) ;

この関数の目的は、ストリームバッファの put領域 から文字を 関連付けられた文字シーケンス へ転送することです。

形式的には、この関数はput領域に少なくとも1文字分のスペースが確保されていることを保証します。基底クラスのバージョンは常に失敗し、成功する可能性のある実装は派生クラスでのみ提供されます( 実装要件 を参照)。標準ライブラリは std::strstreambuf::overflow() , (C++26まで) std::basic_stringbuf::overflow() および std::basic_filebuf::overflow() を提供します。

目次

パラメータ

ch - 格納する文字

戻り値

Traits :: eof ( )

実装要件

この仮想関数のすべてのオーバーライド定義は、以下の制約に従わなければなりません。さもなければ動作は未定義です:

  • この関数の効果は、 保留シーケンス の文字の一部の初期部分列を消費することです。 保留シーケンスは以下のシーケンスの連結として定義されます:
    • 出力領域(形式的には、 pbase() がnullの場合は空シーケンス、 それ以外の場合は pptr ( ) - pbase ( ) 文字で pbase() から始まる)。
    • 文字 ch 、またはchがEOFの場合は何も含まない(形式的には、 Traits :: eq_int_type ( ch, Traits :: eof ( ) ) true を返す場合)。
  • 消費後、出力領域ポインタは残りの文字(存在する場合)を保持するように更新されます。形式的には、保留シーケンスで消費されなかった文字数を r とします:
    • r が非ゼロの場合、 pbase() pptr() は以下の条件をすべて満たすように設定されます:
      • pptr ( ) - pbase ( ) r である。
      • pbase() から始まる r 文字が関連付けられた出力ストリームである。
    • r がゼロ(保留シーケンスのすべての文字が消費された)の場合、 pbase() がnull値に設定されるか、または pbase() pptr() が両方とも同じ非null値に設定されます。
  • この関数は、関連付けられた出力ストリームへの文字の追加が失敗した場合、または上記の規則に従って 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>
// std::arrayで実装されたstd::ostream用バッファ
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()
    {
        // 出力領域ポインタを'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{}; // バッファを値初期化
};
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

関連項目

[virtual]
関連付けられた入力シーケンスから文字を読み取り、getエリアに格納し、nextポインタを進める
(仮想protectedメンバ関数)
[virtual]
関連付けられた入力シーケンスから文字を読み取り、getエリアに格納する
(仮想protectedメンバ関数)
[virtual]
putエリアから関連付けられたファイルに文字を書き込む
( std::basic_filebuf<CharT,Traits> の仮想protectedメンバ関数)
[virtual]
出力シーケンスに文字を追加する
( std::basic_stringbuf<CharT,Traits,Allocator> の仮想protectedメンバ関数)
[virtual]
出力シーケンスに文字を追加する(動的で凍結されていない場合、バッファの再割り当てまたは初期割り当てを行う可能性がある)
( std::strstreambuf の仮想protectedメンバ関数)