std::basic_streambuf<CharT,Traits>:: overflow
|
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 ( )
実装要件
この仮想関数のすべてのオーバーライド定義は、以下の制約に従わなければなりません。さもなければ動作は未定義です:
- この関数の効果は、 保留シーケンス の文字の一部の初期部分列を消費することです。 保留シーケンスは以下のシーケンスの連結として定義されます:
- 消費後、出力領域ポインタは残りの文字(存在する場合)を保持するように更新されます。形式的には、保留シーケンスで消費されなかった文字数を 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> // 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メンバ関数)
|