📄 xlocnum
字号:
_Iosbase.getloc()); // gather field into _Ac
char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac; // point past any sign
const unsigned long _Ans =
_CSTD _Stoulx(_Ptr, &_Ep, _Base, &_Errno); // convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ptr || _Errno != 0 || USHRT_MAX < _Ans)
_State |= ios_base::failbit;
else
_Val = (unsigned short)(_Ac[0] == '-'
? 0 -_Ans : _Ans); // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned int& _Val) const
{ // get unsigned int from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()); // gather field into _Ac
char *_Ptr = _Ac[0] == '-' ? _Ac + 1 : _Ac; // point past any sign
const unsigned long _Ans =
_CSTD _Stoulx(_Ptr, &_Ep, _Base, &_Errno); // convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ptr || _Errno != 0 || UINT_MAX < _Ans)
_State |= ios_base::failbit;
else
_Val = _Ac[0] == '-' ? 0 -_Ans : _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
long& _Val) const
{ // get long from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
const long _Ans = _CSTD _Stolx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()), &_Errno); // gather field, convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned long& _Val) const
{ // get unsigned long from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
const unsigned long _Ans = _CSTD _Stoulx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()), &_Errno); // gather field, convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
#ifdef _LONGLONG
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_LONGLONG& _Val) const
{ // get long long from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
const _LONGLONG _Ans = _CSTD _Stollx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()), &_Errno); // gather field, convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_ULONGLONG& _Val) const
{ // get unsigned long long from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
const _ULONGLONG _Ans = _CSTD _Stoullx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()), &_Errno); // gather field, convert
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
#endif /* _LONGLONG */
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
float& _Val) const
{ // get float from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
int _Errno = 0;
int _Hexexp = 0;
float _Ans = _CSTD _Stofx(_Ac, &_Ep,
_Getffld(_Ac, _First, _Last,
_Iosbase, &_Hexexp), &_Errno); // gather field, convert
if (_Hexexp != 0)
_Ans = _CSTD ldexpf(_Ans, 4 * _Hexexp);
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
double& _Val) const
{ // get double from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
int _Errno = 0;
int _Hexexp = 0;
double _Ans = _CSTD _Stodx(_Ac, &_Ep,
_Getffld(_Ac, _First, _Last,
_Iosbase, &_Hexexp), &_Errno); // gather field, convert
if (_Hexexp != 0)
_Ans = _CSTD ldexp(_Ans, 4 * _Hexexp);
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
long double& _Val) const
{ // get long double from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], *_Ep;
int _Errno = 0;
int _Hexexp = 0;
long double _Ans = _CSTD _Stoldx(_Ac, &_Ep,
_Getffld(_Ac, _First, _Last,
_Iosbase, &_Hexexp), &_Errno); // gather field, convert
if (_Hexexp != 0)
_Ans = _CSTD ldexpl(_Ans, 4 * _Hexexp);
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = _Ans; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
void *& _Val) const
{ // get void pointer from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
#ifdef _LONGLONG
int _Base = _Getifld(_Ac, _First, _Last, ios_base::hex,
_Iosbase.getloc()); // gather field
const _ULONGLONG _Ans =
(sizeof (void *) == sizeof (unsigned long))
? (_ULONGLONG)_CSTD _Stoulx(_Ac, &_Ep, _Base, &_Errno)
: _CSTD _Stoullx(_Ac, &_Ep, _Base, &_Errno);
#else /* _LONGLONG */
const unsigned long _Ans = _CSTD _Stoulx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, ios_base::hex,
_Iosbase.getloc()), &_Errno); // gather field, convert
#endif /* _LONGLONG */
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ep == _Ac || _Errno != 0)
_State |= ios_base::failbit;
else
_Val = (void *)((char *)0 + _Ans); // deliver value
return (_First);
}
private:
int __CLRCALL_OR_CDECL _Getifld(char *_Ac,
_InIt& _First, _InIt& _Last, ios_base::fmtflags _Basefield,
const locale& _Loc) const
{ // get integer field from [_First, _Last) into _Ac
const _Mypunct& _Punct_fac = _USE(_Loc, _Mypunct);
const string _Grouping = _Punct_fac.grouping();
const _Elem _Kseparator = _Grouping.size() == 0
? (_Elem)0 : _Punct_fac.thousands_sep();
const _Elem _E0 = _MAKLOCCHR(_Elem, '0', _Cvt);
char *_Ptr = _Ac;
if (_First == _Last)
; // empty field
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // gather plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // gather minus sign
_Basefield &= ios_base::basefield;
int _Base = _Basefield == ios_base::oct ? 8
: _Basefield == ios_base::hex ? 16
: _Basefield == ios_base::_Fmtzero ? 0 : 10;
bool _Seendigit = false; // seen a digit in input
bool _Nonzero = false; // seen a nonzero digit in input
if (_First != _Last && *_First == _E0)
{ // leading zero, look for 0x, 0X
_Seendigit = true, ++_First;
if (_First != _Last && (*_First == _MAKLOCCHR(_Elem, 'x', _Cvt)
|| *_First == _MAKLOCCHR(_Elem, 'X', _Cvt))
&& (_Base == 0 || _Base == 16))
_Base = 16, _Seendigit = false, ++_First;
else if (_Base == 0)
_Base = 8;
}
int _Dlen = _Base == 0 || _Base == 10 ? 10
: _Base == 8 ? 8 : 16 + 6;
string _Groups((size_t)1, (char)_Seendigit);
size_t _Group = 0;
for (char *const _Pe = &_Ac[_MAX_INT_DIG - 1];
_First != _Last; ++_First)
if (_CSTD memchr((const char *)"0123456789abcdefABCDEF",
*_Ptr = _MAKLOCBYTE(_Elem, *_First, _Cvt), _Dlen) != 0)
{ // got a digit, characterize it and add to group size
if ((_Nonzero || *_Ptr != '0') && _Ptr < _Pe)
++_Ptr, _Nonzero = true;
_Seendigit = true;
if (_Groups[_Group] != CHAR_MAX)
++_Groups[_Group];
}
else if (_Groups[_Group] == '\0'
|| _Kseparator == (_Elem)0
|| *_First != _Kseparator)
break; // not a group separator, done
else
{ // add a new group to _Groups string
_Groups.append((string::size_type)1, '\0');
++_Group;
}
if (_Group == 0)
; // no thousands separators seen
else if ('\0' < _Groups[_Group])
++_Group; // add trailing group to group count
else
_Seendigit = false; // trailing separator, fail
for (const char *_Pg = _Grouping.c_str(); _Seendigit && 0 < _Group; )
if (*_Pg == CHAR_MAX)
break; // end of grouping constraints to check
else if (0 < --_Group && *_Pg != _Groups[_Group]
|| 0 == _Group && *_Pg < _Groups[_Group])
_Seendigit = false; // bad group size, fail
else if ('\0' < _Pg[1])
++_Pg; // group size okay, advance to next test
if (_Seendigit && !_Nonzero)
*_Ptr++ = '0'; // zero field, replace stripped zero(s)
else if (!_Seendigit)
_Ptr = _Ac; // roll back pointer to indicate failure
*_Ptr = '\0';
return (_Base);
}
int __CLRCALL_OR_CDECL _Getffld(char *_Ac,
_InIt& _First, _InIt &_Last,
ios_base& _Iosbase, int *_Phexexp) const
{ // get floating-point field from [_First, _Last) into _Ac
if ((_Iosbase.flags() & ios_base::floatfield) == ios_base::hexfloat)
return (_Getffldx(_Ac, _First, _Last,
_Iosbase, _Phexexp)); // hex format
const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
const string _Grouping = _Punct_fac.grouping();
const _Elem _E0 = _MAKLOCCHR(_Elem, '0', _Cvt);
char *_Ptr = _Ac;
bool _Bad = false;
if (_First == _Last)
; // empty field
else if (*_First == _MAKLOCCHR(_Elem, '+', _Cvt))
*_Ptr++ = '+', ++_First; // gather plus sign
else if (*_First == _MAKLOCCHR(_Elem, '-', _Cvt))
*_Ptr++ = '-', ++_First; // gather minus sign
bool _Seendigit = false; // seen a digit in input
int _Significant = 0; // number of significant digits
int _Pten = 0; // power of 10 multiplier
if (*_Grouping.c_str() == CHAR_MAX || *_Grouping.c_str() <= '\0')
for (; _First != _Last
&& _E0 <= *_First && *_First <= _E0 + 9;
_Seendigit = true, ++_First)
if (_MAX_SIG_DIG <= _Significant)
++_Pten; // just scale by 10
else if (*_First == _E0 && _Significant == 0)
; // drop leading zeros
else
{ // save a significant digit
*_Ptr++ = (char)((*_First - _E0) + '0');
++_Significant;
}
else
{ // grouping specified, gather digits and group sizes
const _Elem _Kseparator = _Grouping.size() == 0
? (_Elem)0 : _Punct_fac.thousands_sep();
string _Groups((size_t)1, '\0');
size_t _Group = 0;
for (; _First != _Last; ++_First)
if (_E0 <= *_First && *_First <= _E0 + 9)
{ // got a digit, add to group size
_Seendigit = true;
if (_MAX_SIG_DIG <= _Significant)
++_Pten; // just scale by 10
else if (*_First == _E0 && _Significant == 0)
; // drop leading zeros
else
{ // save a significant digit
*_Ptr++ = (char)((*_First - _E0) + '0');
++_Significant;
}
if (_Groups[_Group] != CHAR_MAX)
++_Groups[_Group];
}
else if (_Groups[_Group] == '\0'
|| _Kseparator == (_Elem)0
|| *_First != _Kseparator)
break; // not a group separator, done
else
{ // add a new group to _Groups string
_Groups.append((size_t)1, '\0');
++_Group;
}
if (_Group == 0)
; // no thousands separators seen
else if ('\0' < _Groups[_Group])
++_Group; // add trailing group to group count
else
_Bad = true; // trailing separator, fail
for (const char *_Pg = _Grouping.c_str();
!_Bad && 0 < _Group; )
if (*_Pg == CHAR_MAX)
break; // end of grouping constraints to check
else if (0 < --_Group && *_Pg != _Groups[_Group]
|| 0 == _Group && *_Pg < _Groups[_Group])
_Bad = true; // bad group size, fail
else if ('\0' < _Pg[1])
++_Pg; // group size okay, advance to next test
}
if (_Seendigit && _Significant == 0)
*_Ptr++ = '0'; // save at least one leading digit
if (_First != _Last && *_First == _Punct_fac.decimal_point())
*_Ptr++ = localeconv()->decimal_point[0], ++_First; // add .
if (_Significant == 0)
{ // 0000. so far
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -