istream.tcc
来自「c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出」· TCC 代码 · 共 1,170 行 · 第 1/3 页
TCC
1,170 行
basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: putback(char_type __c) { const int_type __eof = traits_type::eof(); _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { __streambuf_type* __sb = this->rdbuf(); if (!__sb || __eof == __sb->sputbackc(__c)) this->setstate(ios_base::badbit); } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } else this->setstate(ios_base::failbit); return *this; } template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>:: unget() { const int_type __eof = traits_type::eof(); _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { __streambuf_type* __sb = this->rdbuf(); if (!__sb || __eof == __sb->sungetc()) this->setstate(ios_base::badbit); } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } else this->setstate(ios_base::failbit); return *this; } template<typename _CharT, typename _Traits> int basic_istream<_CharT, _Traits>::sync() { int __retval = traits_type::eof(); _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { __streambuf_type* __sb = this->rdbuf(); if (!__sb || __retval == __sb->pubsync()) this->setstate(ios_base::badbit); else __retval = 0; } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } return __retval; } template<typename _CharT, typename _Traits> typename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>::tellg() { pos_type __retval = pos_type(-1); bool __testok = this->fail() != true; _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { if (__testok) __retval = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); _M_gcount = __retval; } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } return __retval; } template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(pos_type __pos) { bool __testok = this->fail() != true; _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { if (__testok) _M_gcount = this->rdbuf()->pubseekpos(__pos); } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } return *this; } template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) { bool __testok = this->fail() != true; _M_gcount = 0; sentry __cerb(*this, true); if (__cerb) { try { if (__testok) _M_gcount = this->rdbuf()->pubseekoff(__off, __dir); } catch(exception& __fail){ // 27.6.1.3 paragraph 1 // Turn this on without causing an ios::failure to be thrown. this->setstate(ios_base::badbit); if ((this->exceptions() & ios_base::badbit) != 0) throw; } } return *this; } // 27.6.1.2.3 Character extraction templates template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) { typedef basic_istream<char, _Traits> __istream_type; __istream_type::sentry __cerb(__in, false); if (__cerb) { try { __in.get(__c); } catch(exception& __fail){ // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. __in.setstate(ios_base::badbit); if ((__in.exceptions() & ios_base::badbit) != 0) throw; } } else __in.setstate(ios_base::failbit); return __in; } template<typename _CharT, typename _Traits> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) { typedef basic_istream<_CharT, _Traits> __istream_type; typedef typename __istream_type::__streambuf_type __streambuf_type; typedef typename _Traits::int_type int_type; typedef _CharT char_type; typedef ctype<_CharT> __ctype_type; int_type __extracted = 0; __istream_type::sentry __cerb(__in, false); if (__cerb) { try { // Figure out how many characters to extract. streamsize __num = __in.width(); if (__num <= 0) __num = basic_string<_CharT, _Traits>::npos; __streambuf_type* __sb = __in.rdbuf(); const __ctype_type* __ctype = __in._M_get_fctype_ios(); int_type __c = __sb->sbumpc(); const int_type __eof = _Traits::eof(); bool __testsp = __ctype->is(ctype_base::space, __c); bool __testeof = __c == __eof; while (__extracted < __num - 1 && !__testeof && !__testsp) { *__s++ = __c; ++__extracted; __c = __sb->sbumpc(); __testeof = __c == __eof; __testsp = __ctype->is(ctype_base::space, __c); } if (!__testeof) __sb->sputbackc(__c); else __in.setstate(ios_base::eofbit);#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS//68. Extractors for char* should store null at end *__s = char_type();#endif __in.width(0); } catch(exception& __fail){ // 27.6.1.2.1 Common requirements. // Turn this on without causing an ios::failure to be thrown. __in.setstate(ios_base::badbit); if ((__in.exceptions() & ios_base::badbit) != 0) throw; } } if (!__extracted) __in.setstate(ios_base::failbit); return __in; } // 27.6.1.4 Standard basic_istream manipulators template<typename _CharT, typename _Traits> basic_istream<_CharT,_Traits>& ws(basic_istream<_CharT,_Traits>& __in) { typedef basic_istream<_CharT, _Traits> __istream_type; typedef typename __istream_type::__streambuf_type __streambuf_type; typedef typename __istream_type::__ctype_type __ctype_type; typedef typename __istream_type::int_type __int_type; typedef typename __istream_type::char_type __char_type; __streambuf_type* __sb = __in.rdbuf(); const __ctype_type* __ctype = __in._M_get_fctype_ios(); const __int_type __eof = _Traits::eof(); __int_type __c; bool __testeof; bool __testsp; do { __c = __sb->sbumpc(); __testeof = __c == __eof; __testsp = __ctype->is(ctype_base::space, __c); } while (!__testeof && __testsp); if (!__testeof && !__testsp) __sb->sputbackc(__c); else __in.setstate(ios_base::eofbit); return __in; } // 21.3.7.8 basic_string::getline and operators template<typename _CharT, typename _Traits, typename _Alloc> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __in, basic_string<_CharT, _Traits, _Alloc>& __str) { typedef basic_istream<_CharT, _Traits> __istream_type; typedef typename __istream_type::int_type __int_type; typedef typename __istream_type::__streambuf_type __streambuf_type; typedef typename __istream_type::__ctype_type __ctype_type; typedef basic_string<_CharT, _Traits, _Alloc> __string_type; typedef typename __string_type::size_type __size_type; __istream_type::sentry __cerb(__in, false); if (__cerb) { __str.erase(); streamsize __w = __in.width(); __size_type __n; __n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size(); __int_type __extracted = 0; __streambuf_type* __sb = __in.rdbuf(); const __ctype_type* __ctype = __in._M_get_fctype_ios(); __int_type __c = __sb->sbumpc(); const __int_type __eof = _Traits::eof(); bool __testsp = __ctype->is(ctype_base::space, __c); bool __testeof = __c == __eof; while ( __extracted <= __n && !__testeof && !__testsp) { __str += _Traits::to_char_type(__c); ++__extracted; __c = __sb->sbumpc(); __testeof = __c == __eof; __testsp = __ctype->is(ctype_base::space, __c); } if (!__testeof) __sb->sputbackc(__c); else __in.setstate(ios_base::eofbit); __in.width(0); } return __in; } template<typename _CharT, typename _Traits, typename _Alloc> basic_istream<_CharT, _Traits>& getline(basic_istream<_CharT, _Traits>& __in, basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim) { typedef basic_istream<_CharT, _Traits> __istream_type; typedef typename __istream_type::int_type __int_type; typedef typename __istream_type::__streambuf_type __streambuf_type; typedef typename __istream_type::__ctype_type __ctype_type; typedef basic_string<_CharT, _Traits, _Alloc> __string_type; typedef typename __string_type::size_type __size_type; __size_type __extracted = 0; bool __testdelim = false; __istream_type::sentry __cerb(__in, true); if (__cerb) { __str.erase(); __size_type __n = __str.max_size(); __int_type __idelim = _Traits::to_int_type(__delim); __streambuf_type* __sb = __in.rdbuf(); __int_type __c = __sb->sbumpc(); const __int_type __eof = _Traits::eof(); __testdelim = __idelim == __c; bool __testeof = __c == __eof; while (__extracted <= __n && !__testeof && !__testdelim) { __str += _Traits::to_char_type(__c); ++__extracted; __c = __sb->sbumpc(); __testeof = __c == __eof; __testdelim = __c == __idelim; } if (__testeof) __in.setstate(ios_base::eofbit); } if (!__extracted && !__testdelim) __in.setstate(ios_base::failbit); return __in; } template<class _CharT, class _Traits, class _Alloc> inline basic_istream<_CharT,_Traits>& getline(basic_istream<_CharT, _Traits>& __in, basic_string<_CharT,_Traits,_Alloc>& __str) { return getline(__in, __str, __in.widen('\n')); }} // namespace std// Local Variables:// mode:C++// End:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?