📄 istream.cpp
字号:
base = 0; if (ipfx(0)) { c=bp->sgetc(); for (i = 0; i<MAXLONGSIZ-1; buffer[i] = (char)c,c=bp->snextc(),i++) { if (c==EOF) { state |= ios::eofbit; break; } if (!i) { if ((c=='-') || (c=='+')) { bindex++; continue; } } if ((i==bindex) && (buffer[i-1]== '0')) { if (((c=='x') || (c=='X')) && ((base==0) || (base==16))) { base = 16; // simplifies matters fDigit = 0; continue; } else if (base==0) { base = 8; } } // now simply look for a digit and set fDigit if found else break if (base==16) { if (!_istxdigit(c)) break; } else if ((!_istdigit(c)) || ((base==8) && (c>'7'))) break; fDigit++; } if (!fDigit) { state |= ios::failbit; while (i--) { if(bp->sputbackc(buffer[i])==EOF) { state |= ios::badbit; break; } else state &= ~(ios::eofbit); } i=0; } // buffer contains a valid number or '\0' buffer[i] = '\0'; isfx(); } if (i==MAXLONGSIZ) { state |= ios::failbit; } return base;}/*******************************************************************************/int istream::getdouble(char* buffer, int buflen) // returns length{ int c; int i = 0; int fDigit = 0; // true if legal digit encountered int fDecimal=0; // true if '.' encountered or no longer valid int fExp=0; // true if 'E' or 'e' encounted if (ipfx(0)) { c=bp->sgetc(); for (; i<buflen; buffer[i] = c,c=bp->snextc(),i++) { if (c==EOF) { state |= ios::eofbit; break; } if ((!i) || (fExp==1)) { if ((c=='-') || (c=='+')) { continue; } } if ((c=='.') && (!fExp) && (!fDecimal)) { fDecimal++; continue; } if (((c=='E') || (c=='e')) && (!fExp)) { fDecimal++; // can't allow decimal now fExp++; continue; } if (!_istdigit(c)) break; if (fExp) fExp++; else fDigit++; } if (fExp==1) // E or e with no number after it { if (bp->sputbackc(buffer[i])!=EOF) { i--; state &= ~(ios::eofbit); } else { state |= ios::failbit; } } if ((!fDigit) || (i==buflen)) state |= ios::failbit; // buffer contains a valid number or '\0' buffer[i] = '\0'; isfx(); } return i;}/*******************************************************************************/istream& istream::operator>>(char& c){ int tchar; if (ipfx(0)) { tchar=bp->sbumpc(); if (tchar==EOF) { state |= ios::eofbit|ios::badbit; } else { c = (char)tchar; } isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(short& n){ char ibuffer[MAXLONGSIZ]; long value; char** endptr = (char**)NULL; if (ipfx(0)) { value = strtol(ibuffer, endptr, getint(ibuffer)); if (value>SHRT_MAX) { n = SHRT_MAX; state |= ios::failbit; } else if (value<SHRT_MIN) { n = SHRT_MIN; state |= ios::failbit; } else n = (short) value; isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(unsigned short& n){ char ibuffer[MAXLONGSIZ]; unsigned long value; char** endptr = (char**)NULL; if (ipfx(0)) { value = strtoul(ibuffer, endptr, getint(ibuffer)); if ((value>USHRT_MAX) && (value<=(ULONG_MAX-(-SHRT_MIN)))) { n = USHRT_MAX; state |= ios::failbit; } else n = (unsigned short) value; isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(int& n){ char ibuffer[MAXLONGSIZ]; long value; char ** endptr = (char**)NULL; if (ipfx(0)) { value = strtoul(ibuffer, endptr, getint(ibuffer)); if (value>INT_MAX) { n = INT_MAX; state |= ios::failbit; } else if (value<INT_MIN) { n = INT_MIN; state |= ios::failbit; } else n = (int) value; isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(unsigned int& n){ char ibuffer[MAXLONGSIZ]; unsigned long value; char ** endptr = (char**)NULL; if (ipfx(0)) { value = strtoul(ibuffer, endptr, getint(ibuffer)); if ((value>UINT_MAX) && (value<=(ULONG_MAX-(unsigned long)(-INT_MIN)))) { n = UINT_MAX; state |= ios::failbit; } else n = (unsigned int) value; isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(long& n){ char ibuffer[MAXLONGSIZ]; char ** endptr = (char**)NULL; if (ipfx(0)) { n = strtoul(ibuffer, endptr, getint(ibuffer)); isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(unsigned long& n){ char ibuffer[MAXLONGSIZ]; char ** endptr = (char**)NULL; if (ipfx(0)) { n = strtoul(ibuffer, endptr, getint(ibuffer)); isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(float& n){ char ibuffer[MAXFLTSIZ]; double d; char ** endptr = (char**)NULL; if (ipfx(0)) { if (getdouble(ibuffer, MAXFLTSIZ)>0) { d = strtod(ibuffer, endptr); if (d > FLT_MAX) n = FLT_MAX; else if (d < -FLT_MAX) n = -FLT_MAX; else if ((d>0) && (d< FLT_MIN)) n = FLT_MIN; else if ((d<0) && (d> -FLT_MIN)) n = - FLT_MIN; else n = (float) d; } isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(double& n){ char ibuffer[MAXDBLSIZ]; char ** endptr = (char**)NULL; if (ipfx(0)) { if (getdouble(ibuffer, MAXDBLSIZ)>0) { n = strtod(ibuffer, endptr); } isfx(); } return *this;}/*******************************************************************************/istream& istream::operator>>(long double& n){ char ibuffer[MAXLDBLSIZ]; char** endptr = (char**)NULL; if (ipfx(0)) { if (getdouble(ibuffer, MAXLDBLSIZ)>0) { n = (long double)strtod(ibuffer, endptr); } isfx(); } return *this;}/*******************************************************************************/istream_withassign::istream_withassign(): istream(){}/*******************************************************************************/istream_withassign::istream_withassign(streambuf* _is): istream(_is){}/*******************************************************************************/istream_withassign::~istream_withassign(){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -