vs 2005中ios_base继承自_Iosb<int>,主要提供流状态控制、格式控制、本地化等方面支持。
1、类型和数据定义
class ios_base : public _Iosb<int> { public: // 预定义类型 _BITMASK(_Fmtflags, fmtflags); // 其实是typedef int fmtflags 第一个方便理解 _BITMASK(_Iostate, iostate); _BITMASK(_Openmode, openmode); _BITMASK(_Seekdir, seekdir); typedef std::streamoff streamoff; typedef std::streampos streampos; enum event { // constants for ios events erase_event, imbue_event, copyfmt_event}; typedef void (__CLRCALL_OR_CDECL *event_callback)(event, ios_base&, int); class failure // 用于抛出异常。 : public runtime_error { public: explicit failure(const string &_Message) : runtime_error(_Message) {} virtual ~failure() throw () {} #if !_HAS_EXCEPTIONS protected: virtual void _Doraise() const // exception中有相关信息 { // report the exception _RAISE(*this); } #endif /* _HAS_EXCEPTIONS */ }; class Init // 作用? { // controller for standard-stream initialization public: Init() { _Init_ctor(this); } ~Init() { _Init_dtor(this); } private: static void __cdecl _Init_ctor(Init *); // 位于iostream.cpp中 static void __cdecl _Init_dtor(Init *); // 位于iostream.cpp中 static int& __cdecl _Init_cnt_func(); // 位于iostream.cpp中 static int _Init_cnt; // net constructions - destructions }; // ... private: iostate _Mystate; // stream state iostate _Except; // exception mask fmtflags _Fmtfl; // format flags streamsize _Prec; // field precision streamsize _Wide; // field width _Iosarray *_Arr; // ?? pointer to first node of long/pointer array _Fnarray *_Calls; // ?? pointer to first node of call list locale *_Ploc; // pointer to locale static int _Index; // ?? source of unique indexes for long/pointer array static bool _Sync; // ?? C/C++ synchronization flag (ignored) };
其中:_Mystate是流状态,_Except是异常掩码,用于标识在流在哪些状态下抛出异常;_Fmtfl是格式;_Prec是精度;_Wide是宽度;_Arr 和 _Calls暂不明白; Ploc是本地化相关信息;_Index 和 _Sync 暂不明白。
二、流状态操作:
// 流状态操作 void clear(iostate _State, bool _Reraise) // 第二个参数表示是否重新抛出异常 { // set state, possibly reraise exception _Mystate = (iostate)(_State & _Statmask); if ((_Mystate & _Except) == 0) ; else if (_Reraise) _RERAISE; else if (_Mystate & _Except & badbit) _THROW_NCEE(failure, "ios_base::badbit set"); else if (_Mystate & _Except & failbit) _THROW_NCEE(failure, "ios_base::failbit set"); else _THROW_NCEE(failure, "ios_base::eofbit set"); } void clear(iostate _State = goodbit) { clear(_State, false); } iostate rdstate() const; // return (_Mystate); void setstate(iostate _State) { // merge in state argument if (_State != goodbit) clear((iostate)((int)rdstate() | (int)_State), false); } bool good() const; // return (rdstate() == goodbit); bool eof() const; // return ((int)rdstate() & (int)eofbit); bool fail() const; // return (((int)rdstate() & ((int)badbit | (int)failbit)) != 0); bool bad() const; // return (((int)rdstate() & (int)badbit) != 0); // 异常掩码:用于确定哪些状态下抛出异常 iostate exceptions() const; // return (_Except); void exceptions(iostate _Newexcept) { _Except = (iostate)((int)_Newexcept & (int)_Statmask); clear(_Mystate); }
三、流格式化标志操作:
// 流格式化标志操作 fmtflags flags() const // return (_Fmtfl); fmtflags flags(fmtflags _Newfmtflags) { // set format flags to argument fmtflags _Oldfmtflags = _Fmtfl; _Fmtfl = (fmtflags)((int)_Newfmtflags & (int)_Fmtmask); return (_Oldfmtflags); } fmtflags setf(fmtflags _Newfmtflags, fmtflags _Mask) { // merge in format flags argument under mask argument ios_base::fmtflags _Oldfmtflags = _Fmtfl; _Fmtfl = (fmtflags)(((int)_Fmtfl & (int)~_Mask) | ((int)_Newfmtflags & (int)_Mask & (int)_Fmtmask)); return (_Oldfmtflags); } void unsetf(fmtflags _Mask) { // clear format flags under mask argument _Fmtfl = (fmtflags)((int)_Fmtfl & (int)~_Mask); } streamsize precision(streamsize _Newprecision) { // set precision to argument streamsize _Oldprecision = _Prec; _Prec = _Newprecision; return (_Oldprecision); } streamsize width() const; // return (_Wide); streamsize width(streamsize _Newwidth) { // set width to argument streamsize _Oldwidth = _Wide; _Wide = _Newwidth; return (_Oldwidth); }
四、本地化相关处理:
// 本地化相关处理 locale getloc() const { // get locale return (*_Ploc); } locale imbue(const locale& _Loc) { // set locale to argument locale _Oldlocale = *_Ploc; *_Ploc = _Loc; _Callfns(imbue_event); // _Calls成员变量中维护了一系列函数 return (_Oldlocale); }
五、
五、成员变量_Arr相关处理:
struct _Iosarray { // list element for open-ended sparse array of longs/pointers public: _Iosarray(int _Idx, _Iosarray *_Link) : _Next(_Link), _Index(_Idx), _Lo(0), _Vp(0) { // construct node for index _Idx and link it in } _Iosarray *_Next; // pointer to next node int _Index; // index of this node long _Lo; // stored long value void *_Vp; // stored pointer value }; long& iword(int _Idx) { // return reference to long element return (_Findarr(_Idx)._Lo); } void *& pword(int _Idx) { // return reference to pointer element return (_Findarr(_Idx)._Vp); } _Iosarray& _Findarr(int _Idx) { // locate or make a variable array element _Iosarray *_Ptr, *_Q; for (_Ptr = _Arr, _Q = 0; _Ptr != 0; _Ptr = _Ptr->_Next) if (_Ptr->_Index == _Idx) return (*_Ptr); // found element, return it else if (_Q == 0 && _Ptr->_Lo == 0 && _Ptr->_Vp == 0) _Q = _Ptr; // found recycling candidate if (_Q != 0) { // recycle existing element _Q->_Index = _Idx; return (*_Q); } _Arr = _NEW_CRT _Iosarray(_Idx, _Arr); // make a new element return (*_Arr); }
六、成员变量_Calls处理:
struct _Fnarray { // list element for open-ended sparse array of event handlers _Fnarray(int _Idx, event_callback _Pnew, _Fnarray *_Link) : _Next(_Link), _Index(_Idx), _Pfn(_Pnew) { // construct node for index _Idx and link it in } _Fnarray *_Next; // pointer to next node int _Index; // index of this node event_callback _Pfn; // pointer to event handler }; void register_callback(event_callback _Pfn, int _Idx) { // register event handler _Calls = _NEW_CRT _Fnarray(_Idx, _Pfn, _Calls); }
七、运算符重载:
ios_base& operator=(const ios_base& _Right) { // assign state and format stuff from _Right if (this != &_Right) { // worth doing _Mystate = _Right._Mystate; copyfmt(_Right); } return (*this); } operator void *() const; // eg: if(cin) bool operator!() const; // eg: if(!cin)