📄 istream
字号:
return (*this);
}
_Myt& __CLR_OR_THIS_CALL operator>>(long double& _Val)
{ // extract a long double
ios_base::iostate _State = ios_base::goodbit;
const sentry _Ok(*this);
if (_Ok)
{ // state okay, use facet to extract
const _Nget& _Nget_fac = _USE(ios_base::getloc(), _Nget);
_TRY_IO_BEGIN
_Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
*this, _State, _Val);
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL operator>>(void *& _Val)
{ // extract a void pointer
ios_base::iostate _State = ios_base::goodbit;
const sentry _Ok(*this);
if (_Ok)
{ // state okay, use facet to extract
const _Nget& _Nget_fac = _USE(ios_base::getloc(), _Nget);
_TRY_IO_BEGIN
_Nget_fac.get(_Iter(_Myios::rdbuf()), _Iter(0),
*this, _State, _Val);
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL operator>>(_Mysb *_Strbuf)
{ // extract until end-of-file into a stream buffer
ios_base::iostate _State = ios_base::goodbit;
bool _Copied = false;
const sentry _Ok(*this);
if (_Ok && _Strbuf != 0)
{ // state okay, extract characters
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else
{ // got a character, insert it into buffer
_TRY_BEGIN
if (_Traits::eq_int_type(_Traits::eof(),
_Strbuf->sputc(_Traits::to_char_type(_Meta))))
break;
_CATCH_ALL
break;
_CATCH_END
_Copied = true;
}
_CATCH_IO_END
}
_Myios::setstate(!_Copied ? _State | ios_base::failbit : _State);
return (*this);
}
int_type __CLR_OR_THIS_CALL get()
{ // extract a metacharacter
int_type _Meta = 0;
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (!_Ok)
_Meta = _Traits::eof(); // state not okay, return EOF
else
{ // state okay, extract a character
_TRY_IO_BEGIN
_Meta = _Myios::rdbuf()->sgetc();
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
_State |= ios_base::eofbit | ios_base::failbit; // end of file
else
{ // got a character, count it
_Myios::rdbuf()->sbumpc();
++_Chcount;
}
_CATCH_IO_END
}
_Myios::setstate(_State);
return (_Meta);
}
_Myt& __CLR_OR_THIS_CALL get(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS
return (get(_Str, _Count, _Myios::widen('\n')));
}
_Myt& __CLR_OR_THIS_CALL get(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, stop before _Delim
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _Count)
{ // state okay, extract characters
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; 0 < --_Count; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Traits::to_char_type(_Meta) == _Delim)
break; // got a delimiter, quit
else
{ // got a character, add it to string
*_Str++ = _Traits::to_char_type(_Meta);
++_Chcount;
}
_CATCH_IO_END
}
_Myios::setstate(_Chcount == 0
? _State | ios_base::failbit : _State);
*_Str = _Elem(); // add terminating null character
return (*this);
}
_Myt& __CLR_OR_THIS_CALL get(_Elem& _Ch)
{ // get a character
int_type _Meta = get();
if (!_Traits::eq_int_type(_Traits::eof(), _Meta))
_Ch = _Traits::to_char_type(_Meta);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL get(_Mysb& _Strbuf)
{ // extract up to newline and insert into stream buffer
return (get(_Strbuf, _Myios::widen('\n')));
}
_Myt& __CLR_OR_THIS_CALL get(_Mysb& _Strbuf, _Elem _Delim)
{ // extract up to delimiter and insert into stream buffer
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok)
{ // state okay, use facet to extract
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else
{ // got a character, insert it into stream buffer
_TRY_BEGIN
_Elem _Ch = _Traits::to_char_type(_Meta);
if (_Ch == _Delim
|| _Traits::eq_int_type(_Traits::eof(),
_Strbuf.sputc(_Ch)))
break;
_CATCH_ALL
break;
_CATCH_END
++_Chcount;
}
_CATCH_IO_END
}
if (_Chcount == 0)
_State |= ios_base::failbit;
_Myios::setstate(_State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str, streamsize _Count)
{ // get up to _Count characters into NTCS, discard newline
return (getline(_Str, _Count, _Myios::widen('\n')));
}
_Myt& __CLR_OR_THIS_CALL getline(_Elem *_Str,
streamsize _Count, _Elem _Delim)
{ // get up to _Count characters into NTCS, discard _Delim
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
int_type _Metadelim = _Traits::to_int_type(_Delim);
_TRY_IO_BEGIN
int_type _Meta = _Myios::rdbuf()->sgetc();
for (; ; _Meta = _Myios::rdbuf()->snextc())
if (_Traits::eq_int_type(_Traits::eof(), _Meta))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else if (_Meta == _Metadelim)
{ // got a delimiter, discard it and quit
++_Chcount;
_Myios::rdbuf()->sbumpc();
break;
}
else if (--_Count <= 0)
{ // buffer full, quit
_State |= ios_base::failbit;
break;
}
else
{ // got a character, add it to string
++_Chcount;
*_Str++ = _Traits::to_char_type(_Meta);
}
_CATCH_IO_END
}
*_Str = _Elem(); // add terminating null character
_Myios::setstate(_Chcount == 0 ? _State | ios_base::failbit : _State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL ignore(streamsize _Count = 1,
int_type _Metadelim = _Traits::eof())
{ // ignore up to _Count characters, discarding delimiter
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok && 0 < _Count)
{ // state okay, use facet to extract
_TRY_IO_BEGIN
for (; ; )
{ // get a metacharacter if more room in buffer
int_type _Meta;
if (_Count != INT_MAX && --_Count < 0)
break; // buffer full, quit
else if (_Traits::eq_int_type(_Traits::eof(),
_Meta = _Myios::rdbuf()->sbumpc()))
{ // end of file, quit
_State |= ios_base::eofbit;
break;
}
else
{ // got a character, count it
++_Chcount;
if (_Meta == _Metadelim)
break; // got a delimiter, quit
}
}
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL read(_Elem *_Str, streamsize _Count)
{ // read up to _Count characters into buffer
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok)
{ // state okay, use facet to extract
_TRY_IO_BEGIN
const streamsize _Num = _Myios::rdbuf()->sgetn(_Str, _Count);
_Chcount += _Num;
if (_Num != _Count)
_State |= ios_base::eofbit | ios_base::failbit; // short read
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
streamsize __CLR_OR_THIS_CALL readsome(_Elem *_Str,
streamsize _Count)
{ // read up to _Count characters into buffer, without blocking
_DEBUG_POINTER(_Str);
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
streamsize _Num;
if (!_Ok)
_State |= ios_base::failbit; // no buffer, fail
else if ((_Num = _Myios::rdbuf()->in_avail()) < 0)
_State |= ios_base::eofbit; // no characters available
else if (0 < _Num)
read(_Str, _Num < _Count ? _Num : _Count); // read available
_Myios::setstate(_State);
return (gcount());
}
int_type __CLR_OR_THIS_CALL peek()
{ // return next character, unconsumed
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
int_type _Meta = 0;
const sentry _Ok(*this, true);
if (!_Ok)
_Meta = _Traits::eof(); // state not okay, return EOF
else
{ // state okay, read a character
_TRY_IO_BEGIN
if (_Traits::eq_int_type(_Traits::eof(),
_Meta = _Myios::rdbuf()->sgetc()))
_State |= ios_base::eofbit;
_CATCH_IO_END
}
_Myios::setstate(_State);
return (_Meta);
}
_Myt& __CLR_OR_THIS_CALL putback(_Elem _Ch)
{ // put back a character
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok)
{ // state okay, put character back
_TRY_IO_BEGIN
if (_Traits::eq_int_type(_Traits::eof(),
_Myios::rdbuf()->sputbackc(_Ch)))
_State |= ios_base::badbit;
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL unget()
{ // put back last read character
ios_base::iostate _State = ios_base::goodbit;
_Chcount = 0;
const sentry _Ok(*this, true);
if (_Ok)
{ // state okay, use facet to extract
_TRY_IO_BEGIN
if (_Traits::eq_int_type(_Traits::eof(),
_Myios::rdbuf()->sungetc()))
_State |= ios_base::badbit;
_CATCH_IO_END
}
_Myios::setstate(_State);
return (*this);
}
streamsize __CLR_OR_THIS_CALL gcount() const
{ // get count from last extraction
return (_Chcount);
}
int __CLR_OR_THIS_CALL sync()
{ // synchronize with input source
ios_base::iostate _State = ios_base::goodbit;
int _Ans;
if (_Myios::rdbuf() == 0)
_Ans = -1; // no buffer, fail
else if (_Myios::rdbuf()->pubsync() == -1)
{ // stream buffer sync failed, fail
_State |= ios_base::badbit;
_Ans = -1;
}
else
_Ans = 0; // success
_Myios::setstate(_State);
return (_Ans);
}
_Myt& __CLR_OR_THIS_CALL seekg(pos_type _Pos)
{ // set input stream position to _Pos
if (!ios_base::fail()
&& (off_type)_Myios::rdbuf()->pubseekpos(_Pos,
ios_base::in) == _BADOFF)
_Myios::setstate(ios_base::failbit);
return (*this);
}
_Myt& __CLR_OR_THIS_CALL seekg(off_type _Off, ios_base::seekdir _Way)
{ // change input stream position by _Off, according to _Way
if (!ios_base::fail()
&& (off_type)_Myios::rdbuf()->pubseekoff(_Off, _Way,
ios_base::in) == _BADOFF)
_Myios::setstate(ios_base::failbit);
return (*this);
}
pos_type __CLR_OR_THIS_CALL tellg()
{ // return input stream position
if (!ios_base::fail())
return (_Myios::rdbuf()->pubseekoff(0,
ios_base::cur, ios_base::in));
else
return (pos_type(_BADOFF));
}
private:
streamsize _Chcount; // the character count
};
// basic_istream TEMPLATE OPERATORS
template<class _Elem,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -