# 标准库头文件 <streambuf>

< cpp‎ | header

此头文件是输入/输出库的一部分。

### 类
basic_streambuf | 抽象原生设备 (类模板)
`streambuf` | std::basic_streambuf<char> (typedef)
`wstreambuf` | std::basic_streambuf<wchar_t> (typedef)

### 概要

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
        class basic_streambuf;
      using streambuf  = basic_streambuf<char>;
      using wstreambuf = basic_streambuf<wchar_t>;
    }

#### 类模板 std::basic_streambuf

    namespace std {
      template<class CharT, class Traits = char_traits<CharT>>
      class basic_streambuf {
      public:
        using char_type   = CharT;
        using int_type    = typename Traits::int_type;
        using pos_type    = typename Traits::pos_type;
        using off_type    = typename Traits::off_type;
        using traits_type = Traits;

        virtual ~basic_streambuf();

        // 本地环境
        locale   pubimbue(const locale& loc);
        locale   getloc() const;

        // buffer and positioning
        basic_streambuf* pubsetbuf(char_type* s, streamsize n);
        pos_type pubseekoff(off_type off, ios_base::seekdir way,
                            ios_base::openmode which
                              = ios_base::in | ios_base::out);
        pos_type pubseekpos(pos_type sp,
                            ios_base::openmode which
                              = ios_base::in | ios_base::out);
        int      pubsync();

        // 获取与放置区
        // 获取区
        streamsize in_avail();
        int_type snextc();
        int_type sbumpc();
        int_type sgetc();
        streamsize sgetn(char_type* s, streamsize n);

        // 回放
        int_type sputbackc(char_type c);
        int_type sungetc();

        // 放置区
        int_type   sputc(char_type c);
        streamsize sputn(const char_type* s, streamsize n);

      protected:
        basic_streambuf();
        basic_streambuf(const basic_streambuf& rhs);
        basic_streambuf& operator=(const basic_streambuf& rhs);

        void swap(basic_streambuf& rhs);

        // 获取区访问
        char_type* eback() const;
        char_type* gptr()  const;
        char_type* egptr() const;
        void       gbump(int n);
        void       setg(char_type* gbeg, char_type* gnext, char_type* gend);

        // 放置区访问
        char_type* pbase() const;
        char_type* pptr() const;
        char_type* epptr() const;
        void       pbump(int n);
        void       setp(char_type* pbeg, char_type* pend);

        // 虚函数
        // 本地环境
        virtual void imbue(const locale& loc);

        // buffer management and positioning
        virtual basic_streambuf* setbuf(char_type* s, streamsize n);
        virtual pos_type seekoff(off_type off, ios_base::seekdir way,
                                 ios_base::openmode which
                                   = ios_base::in | ios_base::out);
        virtual pos_type seekpos(pos_type sp,
                                 ios_base::openmode which
                                   = ios_base::in | ios_base::out);
        virtual int      sync();

        // 获取区
        virtual streamsize showmanyc();
        virtual streamsize xsgetn(char_type* s, streamsize n);
        virtual int_type   underflow();
        virtual int_type   uflow();

        // 回放
        virtual int_type   pbackfail(int_type c = Traits::eof());

        // 放置区
        virtual streamsize xsputn(const char_type* s, streamsize n);
        virtual int_type   overflow(int_type c = Traits::eof());
      };
    }