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()
[編集] 実装要件
この仮想関数をオーバーライドするすべての定義は、以下の制約に従わなければなりません。そうでない場合、動作は未定義となります。
- この関数の効果は、*保留シーケンス* の初期部分シーケンスを消費することです。保留シーケンスは、以下のシーケンスの連結として定義されます。
- 消費後、出力領域ポインタは、残りの文字(もしあれば)を保持するように更新されます。形式的には、保留シーケンスのうち消費されなかった文字の数を r とすると
- 関連付けられた出力ストリームへの文字の追加に失敗した場合、または上記の規則に従って 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 メンバ関数) |