Namespaces
Variants

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

From cppreference.net
protected :
void setp ( char_type * pbeg, char_type * pend ) ;

put領域を定義するポインタの値を設定します。

呼び出し後、 pbase ( ) == pbeg pptr ( ) == pbeg および epptr ( ) == pend がすべて true となります。

[ pbeg , pend ) のいずれかが 有効な範囲 でない場合、動作は未定義です。

目次

パラメータ

pbeg - プット領域の新しい先頭へのポインタ
pend - プット領域の新しい終端へのポインタ

#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;
    ArrayedStreamBuffer()
    {
        // 出力領域ポインタを"buffer"で動作するように設定
        Base::setp(buffer.data(), buffer.data() + size);
    }
    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{}; // "buffer"を値初期化
};
int main()
{
    ArrayedStreamBuffer<10> streambuf;
    std::ostream stream(&streambuf);
    stream << "hello";
    stream << ",";
    streambuf.print_buffer();
}

出力:

h e l l o , \0 \0 \0 \0

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 4023 C++98 setp は出力シーケンスが有効な範囲であることを要求していなかった 要求する

関連項目

入力シーケンスの開始、次、終了ポインタの位置を再設定する
(protected member function)