std::basic_streambuf<CharT,Traits>::overflow
提供: cppreference.com
< cpp | io | basic streambuf
virtual int_type overflow( int_type ch = Traits::eof() ); |
||
pbase() から始まる文字シーケンスの先頭部分をいくらか出力シーケンスに保存し、 put 領域のポインタを更新する (必要であれば) ことによって、 put 領域に少なくとも1文字の空間があることを保証します。 ch
が Traits::eof() でなければ (すなわち Traits::eq_int_type(ch, Traits::eof()) != true であれば)、それは put 領域に置かれるか、出力シーケンスに直接保存されます。
この関数はさらなるデータを書き込むための位置を定義するために pptr
、 epptr
および pbase
を更新するかもしれません。 失敗した場合、この関数は pptr() == nullptr または pptr() == epptr であることを保証します。
この関数の基底クラスのバージョンは何もしません。 派生クラスは使い切った場合に put 領域を更新できるようにこの関数をオーバーライドするかもしれません
目次 |
[編集] 引数
ch | - | put 領域に格納する文字 |
[編集] 戻り値
成功した場合は Traits::eof() と等しくない未規定な値を返します。 失敗した場合は Traits::eof() を返します。
この関数の基底クラスのバージョンは Traits::eof() を返します。
[編集] ノート
sputc() および sputn() はこの関数をオーバーフロー (pptr() == nullptr または pptr() >= epptr()) の場合にだけ呼びます。
[編集] 例
Run this code
#include <iostream> #include <array> // Buffer for std::ostream implemented by std::array template<std::size_t SIZE, class CharT = char> class ArrayedStreamBuffer : public std::basic_streambuf<CharT> { public: using Base = std::basic_streambuf<CharT>; using char_type = typename Base::char_type; using int_type = typename Base::int_type; ArrayedStreamBuffer() : buffer_{} // value-initialize buffer_ to all zeroes { Base::setp(buffer_.begin(), buffer_.end()); // set std::basic_streambuf // put area pointers to work with 'buffer_' } int_type overflow(int_type ch) { std::cout << "overflow\n"; return Base::overflow(ch); } void print_buffer() { for (const auto& i: buffer_) { if (i == 0) { std::cout << "NULL"; } 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 NULL NULL NULL NULL NULL 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
[編集] 関連項目
[仮想] |
紐付けられている入力シーケンスから get 領域に文字を読み込み、次ポインタを進めます (仮想プロテクテッドメンバ関数) |
[仮想] |
紐付けられている入力シーケンスから get 領域に文字を読み込みます (仮想プロテクテッドメンバ関数) |
[仮想] |
put 領域から紐付けられているファイルに文字を書き込みます ( std::basic_filebuf<CharT,Traits> の仮想プロテクテッドメンバ関数)
|
[仮想] |
出力シーケンスに文字を追加します ( std::basic_stringbuf<CharT,Traits,Allocator> の仮想プロテクテッドメンバ関数)
|
[仮想] |
出力シーケンスに文字を追加します。 動的な場合、または凍結されていない場合、バッファを再確保または初期確保することがあります ( std::strstreambuf の仮想プロテクテッドメンバ関数)
|