分享
 
 
 

C++的流basic_streambuf

王朝c/c++·作者佚名  2006-09-15
窄屏简体版  字體: |||超大  

不是个抽象类,但是他是C++流的基类.它提供了基本的缓冲区管理.它包含六个缓存区指针,三个分别是读指针(开头,结尾,当前),另外三个是写指针(开头,结尾,当前)

读开始指针 当前读指针 读结尾指针

_M_gbegin _M_gnext _M_gend

=========================================================

^ ^ ^

_M_pbegin _M_pnext _M_pend

写开始指针 当前写指针 写结尾指针

template <class_CharT, class_Traits>

classbasic_streambuf

{

friendclassbasic_istream<_CharT, _Traits>;

friendclassbasic_ostream<_CharT, _Traits>;

public: // Typedefs.

typedef_CharT char_type;

typedeftypename_Traits::int_type int_type;

typedeftypename_Traits::pos_type pos_type;

typedeftypename_Traits::off_type off_type;

typedef_Traits traits_type;

public: // Destructor.

virtual ~basic_streambuf() {}

public: // Locale-related functions.

localepubimbue(constlocale& __loc) {

this->imbue(__loc);

locale__tmp = _M_locale;

_M_locale = __loc;

return__tmp;

}

localegetloc() const { return_M_locale; }

public: // Buffer management.

//设置缓冲区和长度

basic_streambuf* pubsetbuf(char_type* __s, streamsize__n)

{ returnthis->setbuf(__s, __n); }

//设置缓冲区偏移量,简单调用seekoff()函数

pos_typepubseekoff(off_type__offset, ios_base::seekdir__way,

ios_base::openmode__mod = ios_base::in | ios_base::out)

{ returnthis->seekoff(__offset, __way, __mod); }

//设置缓冲区位置,简单调用seekpos()函数

pos_typepubseekpos(pos_type__sp,

ios_base::openmode__mod = ios_base::in | ios_base::out)

{ returnthis->seekpos(__sp, __mod); }

//放置缓冲区同步,简单调用sync()函数

intpubsync() { returnthis->sync(); }

public:

// 读取字符的公共成员函数

//比较当前指针和结尾指针,如果在结尾之前返回剩下的缓冲区大小.否则调用showmanyc()函数

streamsizein_avail() {

return_M_gnext < _M_gend ? _M_gend - _M_gnext : this->showmanyc();

}

// 移动到下一个字符,并返回下一字符

int_typesnextc() {

return_M_gend - _M_gnext > 1 ? _Traits::to_int_type(*++_M_gnext)

: this->_M_snextc_aux();

}

// 移动到下一个字符,并返回当前字符

int_typesbumpc() {

return_M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext++)

: this->uflow();

}

//并返回当前字符,指针不移动到

int_typesgetc() {

return_M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext)

: this->underflow();

}

// 获取n个字符串到参数__s

streamsizesgetn(char_type* __s, streamsize__n)

{ returnthis->xsgetn(__s, __n); }

// 比较当前前一个字符是否与参数__c相等,相等则返回,移动当前指针当前前一个字符并返回

int_typesputbackc(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_typesungetc() {

return_M_gbegin < _M_gnext

? _Traits::to_int_type(*--_M_gnext)

: this->pbackfail();

}

public:

// 公共写字符成员函数

// 写入一个字符,

int_typesputc(char_type__c) {

return_M_pnext < _M_pend

? _Traits::to_int_type(*_M_pnext++ = __c)

: this->overflow(_Traits::to_int_type(__c));

}

// 写入长度为n的字串

streamsizesputn(constchar_type* __s, streamsize__n)

{ returnthis->xsputn(__s, __n); }

// 扩展写n个字符函数

streamsize_M_sputnc(char_type__c, streamsize__n)

{ returnthis->_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个字符

voidgbump(int__n) { _M_gnext += __n; }

// 从新设置读的三个指针

voidsetg(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个字符

voidpbump(int__n) { _M_pnext += __n; }

// 从新设置读的三个指针

voidsetp(char_type* __pbegin, char_type* __pend) {

_M_pbegin = __pbegin;

_M_pnext = __pbegin;

_M_pend = __pend;

}

protected:

// 本地化虚函数

virtualvoidimbue(constlocale&) {}

protected:

// 内存管理虚函数,当前置返回自己this

virtualbasic_streambuf* setbuf(char_type*, streamsize)

{ returnthis; }

// 通过一个整型偏移值,改变流的位置.该函数这里什么读没作,只返回-1,在子类中重载

virtualpos_typeseekoff(off_type, ios_base::seekdir,

ios_base::openmode = ios_base::in | ios_base::out)

{ returnpos_type(-1); }

// 通过前面获取流位置,改变流的位置.该函数这里什么读没作,只返回-1,在子类中重载

virtualpos_type

seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out)

{ returnpos_type(-1); }

// 同步(刷新).缓冲区.所有的子类中重载

virtualintsync() { return 0; }

protected:

// 返回在在抵达文件结尾更低级可以读取字符数. (-1 是特定值,意味着underflow 将失败.)

// 函数在子类中重载

virtualstreamsizeshowmanyc()

{ return 0; }

// 读取n的字符. 返回可读取的字符数

virtualstreamsizexsgetn(char_type* __s, streamsize__n);

// 当没有读取的位置时调用.如: gptr() 返回为空时或者gptr() >= egptr().

virtualint_typeunderflow()

{ return_Traits::eof(); }

// 类似underflow(), 但是使用在unbuffered 输入.

virtualint_typeuflow() {

return_Traits::eq_int_type(this->underflow(), _Traits::eof())

? _Traits::eof()

: _Traits::to_int_type(*_M_gnext++);

}

// 当没有放置的位置时调用.如: gptr() 返回为空时或者gptr() == eback().

virtualint_typepbackfail(int_type__c = _Traits::eof())

{ return_Traits::eof(); }

protected:

// 写n 字符,返回写的字符数

virtualstreamsizexsputn(constchar_type* __s, streamsize__n);

// 当没有写位置时调用

virtualint_typeoverflow(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

};

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有