std::basic_streambuf<CharT,Traits>::overflow
提供: cppreference.com
<tbody>
</tbody>
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の仮想プロテクテッドメンバ関数)
|