Namespaces
Variants

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

From ja.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メンバ関数)