名前空間
変種
操作

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

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

この関数の意図は、ストリームバッファの[[cpp/io/basic_streambuf|出力領域]から関連付けられた文字シーケンスへ文字を転送することです。

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

目次

[編集] パラメータ

文字 - 出力領域に格納する文字

[編集] 戻り値

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>
 
// 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

[編集] 関連項目

[virtual]
関連付けられた入力シーケンスから取得領域に文字を読み込み、次のポインタを進める
(virtual protected member function) [編集]
[virtual]
関連付けられた入力シーケンスから取得領域に文字を読み込む
(virtual protected member function) [編集]
[virtual]
ファイルバッファの格納領域から、関連付けられたファイルへ文字を書き込みます。
(std::basic_filebuf<CharT,Traits> の保護仮想メンバ関数) [編集]
[virtual]
出力シーケンスに文字を追加する
(std::basic_stringbuf<CharT,Traits,Allocator> の仮想 protected メンバ関数) [編集]
[virtual]
出力シーケンスに文字を追加します。動的で凍結されていない場合は、バッファを再割り当てまたは最初に割り当てることができます。
(std::strstreambuf の仮想 protected メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)