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 + -
显示快捷键?