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

来自cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
protected:
void setp( char_type* pbeg, char_type* pend );

设置定义放置区的指针值。

调用后,pbase() == pbegpptr() == pbegepptr() == pend 都是 true

如果 [pbegpend) 不是有效范围,那么行为未定义。

参数

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()
    {
        // 设置 std::basic_streambuf 放置区指针以 “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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 4023 C++98 setp 不要求输出序列是有效范围 要求有效

参阅

重定位输入序列的起始、下一位置和终止指针
(受保护成员函数)