C++的流basic_streambuf

 摘自: http://blog.csdn.net/linweixuan/archive/2006/09/09/1197233.aspx
不是个抽象类 , 但是他是 C++ 流的基类 . 它提供了基本的缓冲区管理 . 它包含六个缓存区指针 , 三个分别是读指针 ( 开头 , 结尾 , 当前 ), 另外三个是写指针 ( 开头 , 结尾 , 当前 )
 
    读开始指针                             当前读指针                                     读结尾指针
_M_gbegin                          _M_gnext                      _M_gend
         
         =========================================================    
              ^                                                      ^                                              ^
       _M_pbegin                          _M_pnext                      _M_pend
           写开始指针                             当前写指针                             写结尾指针
 
template < class _CharT , class _Traits >
class basic_streambuf
{
  friend class basic_istream < _CharT , _Traits >;
  friend class basic_ostream < _CharT , _Traits >;
public :                         // Typedefs.
  typedef _CharT                    char_type ;
  typedef typename _Traits :: int_type        int_type ;
  typedef typename _Traits :: pos_type     pos_type ;
  typedef typename _Traits :: off_type       off_type ;
  typedef _Traits                      traits_type ;
 
public :                         // Destructor.
  virtual ~ basic_streambuf () {}
 
public :                         // Locale-related functions.
  locale pubimbue ( const locale & __loc ) {
    this -> imbue ( __loc );
    locale __tmp = _M_locale ;
    _M_locale = __loc ;
    return __tmp ;
 }
  locale getloc () const { return _M_locale ; }
 
public :                         // Buffer management.
  // 设置缓冲区和长度
  basic_streambuf * pubsetbuf ( char_type * __s , streamsize __n )
    { return this -> setbuf ( __s , __n ); }
 
 // 设置缓冲区偏移量 , 简单调用 seekoff() 函数
  pos_type pubseekoff ( off_type __offset , ios_base :: seekdir __way ,
                      ios_base :: openmode __mod = ios_base :: in | ios_base :: out )
    { return this -> seekoff ( __offset , __way , __mod ); }
// 设置缓冲区位置 , 简单调用 seekpos() 函数
  pos_type pubseekpos ( pos_type __sp ,
                      ios_base :: openmode __mod = ios_base :: in | ios_base :: out )
    { return this -> seekpos ( __sp , __mod ); }
 
// 放置缓冲区同步 , 简单调用 sync() 函数
  int pubsync () { return this -> sync (); }
 
public :                       
  // 读取字符的公共成员函数  
 
// 比较当前指针和结尾指针 , 如果在结尾之前返回剩下的缓冲区大小 . 否则调用 showmanyc() 函数
  streamsize in_avail () {
    return _M_gnext < _M_gend ? _M_gend - _M_gnext : this -> showmanyc ();
 }
 
 // 移动到下一个字符 , 并返回下一字符
  int_type snextc () {
    return _M_gend - _M_gnext > 1 ? _Traits :: to_int_type (*++ _M_gnext )
                                  : this -> _M_snextc_aux ();
 }
 
 // 移动到下一个字符 , 并返回当前字符
  int_type sbumpc () {
    return _M_gnext < _M_gend ? _Traits :: to_int_type (* _M_gnext ++)
                              : this -> uflow ();
 }
 
// 并返回当前字符 , 指针不移动到
  int_type sgetc () {
    return _M_gnext < _M_gend ? _Traits :: to_int_type (* _M_gnext )
                              : this -> underflow ();
 }
   
 // 获取 n 个字符串到参数 __s
  streamsize sgetn ( char_type * __s , streamsize __n )
    { return this -> xsgetn ( __s , __n ); }
 
 // 比较当前前一个字符是否与参数 __c 相等 , 相等则返回 , 移动当前指针 当前前一个字符并返回
  int_type sputbackc ( char_type __c ) {
    return _M_gbegin < _M_gnext && _Traits :: eq ( __c , *( _M_gnext - 1))
      ? _Traits :: to_int_type (*-- _M_gnext )
      : this -> pbackfail ( _Traits :: to_int_type ( __c ));
 }
 
 // 移动当前指针 当前前一个字符并返回
  int_type sungetc () {
    return _M_gbegin < _M_gnext
      ? _Traits :: to_int_type (*-- _M_gnext )
      : this -> pbackfail ();
 }
 
public :                        
// 公共写字符成员函数
 
 // 写入一个字符 ,
  int_type sputc ( char_type __c ) {
    return _M_pnext < _M_pend
      ? _Traits :: to_int_type (* _M_pnext ++ = __c )
      : this -> overflow ( _Traits :: to_int_type ( __c ));
 }
 
 // 写入长度为 n 的字串
  streamsize sputn ( const char_type * __s , streamsize __n )
    { return this -> xsputn ( __s , __n ); }
 
 // 扩展写 n 个字符函数
  streamsize _M_sputnc ( char_type __c , streamsize __n )
    { return this -> _M_xsputnc ( __c , __n ); }
 
public :                        
// 线程安全的锁
 _STL_mutex_lock _M_lock ;
 
protected :                     
// 缺省构造函数
  basic_streambuf ()
    : _M_gbegin (0), _M_gnext (0), _M_gend (0),
      _M_pbegin (0), _M_pnext (0), _M_pend (0),
      _M_locale ()
    {
      _M_lock ._M_initialize();
    }
 
protected :                     
// 保护的获取读指针的成员函数
  char_type * eback () const { return _M_gbegin ; }   // 开头读指针
  char_type * gptr ()  const { return _M_gnext ; }   // 当前读指针
  char_type * egptr () const { return _M_gend ; }   // 结尾读指针
 
 // 将读指针向移动 n 个字符
  void gbump ( int __n ) { _M_gnext += __n ; }
 
 // 从新设置读的三个指针
  void setg ( char_type * __gbegin , char_type * __gnext , char_type * __gend ) {
    _M_gbegin = __gbegin ;
    _M_gnext  = __gnext ;
    _M_gend    = __gend ;
 }
 
protected :                     
// 保护的获取写指针的成员函数
        
  char_type * pbase () const { return _M_pbegin ; } // 开头读指针
  char_type * pptr ()  const { return _M_pnext ; }  // 当前读指针
  char_type * epptr () const { return _M_pend ; }   // 结尾读指针
 
 // 将写指针向移动 n 个字符
  void pbump ( int __n ) { _M_pnext += __n ; }
 
// 从新设置读的三个指针
  void setp ( char_type * __pbegin , char_type * __pend ) {
    _M_pbegin = __pbegin ;
    _M_pnext  = __pbegin ;
    _M_pend    = __pend ;
 } 
 
protected :                     
// 本地化虚函数
  virtual void imbue ( const locale &) {}
 
protected :                     
// 内存管理 虚函数 , 当前置返回自己 this
  virtual basic_streambuf * setbuf ( char_type *, streamsize )
    { return this ; }
 
 
 // 通过一个整型偏移值 , 改变流的位置 . 该函数这里什么读没作 , 只返回 -1, 在子类中重载
  virtual pos_type seekoff ( off_type , ios_base :: seekdir ,
                           ios_base :: openmode = ios_base :: in | ios_base :: out )
    { return pos_type (-1); }
 
// 通过前面获取流位置 , 改变流的位置 . 该函数这里什么读没作 , 只返回 -1, 在子类中重载
  virtual pos_type
  seekpos ( pos_type , ios_base :: openmode = ios_base :: in | ios_base :: out )
    { return pos_type (-1); }
 
 // 同步 ( 刷新 ). 缓冲区 . 所有的子类中重载
  virtual int sync () { return 0; }
 
protected :                     
 // 返回在在抵达文件结尾更低级可以读取字符数 . (-1 是特定值 , 意味着 underflow 将失败 .)
// 函数在子类中重载
  virtual streamsize showmanyc ()
    { return 0; }
 
 // 读取 n 的字符 . 返回可读取的字符数
  virtual streamsize xsgetn ( char_type * __s , streamsize __n );
 
 // 当没有读取的位置时调用 . : gptr() 返回为空时或者 gptr() >= egptr().
  virtual int_type underflow ()
    { return _Traits :: eof (); }
 
 // 类似 underflow(), 但是使用在 unbuffered 输入 .
  virtual int_type uflow () {
    return _Traits :: eq_int_type ( this -> underflow (), _Traits :: eof ())
      ? _Traits :: eof ()
      : _Traits :: to_int_type (* _M_gnext ++);
 }
 
// 当没有放置的位置时调用 . : gptr() 返回为空时或者 gptr() == eback().
  virtual int_type pbackfail ( int_type __c = _Traits :: eof ())
    { return _Traits :: eof (); }
 
protected :              
 // n 字符 , 返回写的字符数
  virtual streamsize xsputn ( const char_type * __s , streamsize __n );
 
// 当没有写位置时调用
  virtual int_type overflow ( int_type = _Traits :: eof ())
    { return _Traits :: eof (); }
 
private :                       
  char_type * _M_gbegin ;         // get 区的开始指针
  char_type * _M_gnext ;          // get 区的当前指针
  char_type * _M_gend ;           // get 区的结尾指针
 
  char_type * _M_pbegin ;         // put 区的开始指针
  char_type * _M_pnext ;          // put 区的当前指针
  char_type * _M_pend ;           // put 区的结尾指针
 
  locale _M_locale ;             // The streambuf's locale object
};
 
 

你可能感兴趣的:(C++的流basic_streambuf)