📄 iostream.cpp
字号:
char fill_char = stream.fill(); if (padding > 0 && pad_kind != (ios::fmtflags)ios::left && pad_kind != (ios::fmtflags)ios::internal) // Default (right) adjust. if (_IO_padn(sbuf, fill_char, padding) < padding) goto failed; if (sign < 0 || show_pos) { char ch = sign < 0 ? '-' : '+'; if (sbuf->sputc(ch) < 0) goto failed; } if (show_base_len) if (_IO_sputn(sbuf, show_base, show_base_len) <= 0) goto failed; if (pad_kind == (ios::fmtflags)ios::internal && padding > 0) if (_IO_padn(sbuf, fill_char, padding) < padding) goto failed; if (_IO_sputn (sbuf, buf_ptr, buf_len) != buf_len) goto failed; if (pad_kind == (ios::fmtflags)ios::left && padding > 0) // Left adjustment if (_IO_padn(sbuf, fill_char, padding) < padding) goto failed; stream.osfx(); return; failed: stream.set(ios::badbit); stream.osfx();}ostream& ostream::operator<<(int n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); int sign = 1; unsigned int abs_n = (unsigned)n; if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0) abs_n = -((unsigned)n), sign = -1; write_int(*this, abs_n, sign); _IO_cleanup_region_end (0); } return *this;}ostream& ostream::operator<<(unsigned int n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); write_int(*this, n, 0); _IO_cleanup_region_end (0); } return *this;}ostream& ostream::operator<<(long n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); int sign = 1; unsigned long abs_n = (unsigned long)n; if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0) abs_n = -((unsigned long)n), sign = -1; write_int(*this, abs_n, sign); _IO_cleanup_region_end (0); } return *this;}ostream& ostream::operator<<(unsigned long n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); write_int(*this, n, 0); _IO_cleanup_region_end (0); } return *this;}#if defined(__GNUC__) && !defined(__STRICT_ANSI__)ostream& ostream::operator<<(long long n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); int sign = 1; unsigned long long abs_n = (unsigned long long)n; if (n < 0 && (flags() & (ios::oct|ios::hex)) == 0) abs_n = -((unsigned long long)n), sign = -1; write_int(*this, abs_n, sign); _IO_cleanup_region_end (0); } return *this;}ostream& ostream::operator<<(unsigned long long n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); write_int(*this, n, 0); _IO_cleanup_region_end (0); } return *this;}#endif /*__GNUC__*/ostream& ostream::operator<<(double n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); // Uses __cvt_double (renamed from static cvt), in Chris Torek's // stdio implementation. The setup code uses the same logic // as in __vsbprintf.C (also based on Torek's code). int format_char; if ((flags() & ios::floatfield) == ios::fixed) format_char = 'f'; else if ((flags() & ios::floatfield) == ios::scientific) format_char = flags() & ios::uppercase ? 'E' : 'e'; else format_char = flags() & ios::uppercase ? 'G' : 'g'; int prec = precision(); if (prec <= 0 && !(flags() & ios::fixed)) prec = 6; /* default */ // Do actual conversion.#if _G_HAVE_PRINTF_FP { struct printf_info info = { prec: prec, width: width(0), spec: format_char, is_long_double: 0, is_short: 0, is_long: 0, alt: (flags() & ios::showpoint) != 0, space: 0, left: (flags() & ios::left) != 0, showsign: (flags() & ios::showpos) != 0, group: 0, pad: fill()#if defined __GLIBC__ && __GLIBC__ >= 2 , extra: 0#endif }; const void *ptr = (const void *) &n; if (__printf_fp (rdbuf(), &info, &ptr) < 0) set(ios::badbit|ios::failbit); }#elif defined _IO_USE_DTOA if (_IO_outfloat(n, rdbuf(), format_char, width(0), prec, flags(), flags() & ios::showpos ? '+' : 0, fill()) < 0) set(ios::badbit|ios::failbit); // ??#else int fpprec = 0; // 'Extra' (suppressed) floating precision. if (prec > MAXFRACT) { if (flags() & (ios::fixed|ios::scientific) & ios::showpos) fpprec = prec - MAXFRACT; prec = MAXFRACT; } int negative; char buf[BUF]; int sign = '\0'; char *cp = buf; *cp = 0; int size = __cvt_double(n, prec, flags() & ios::showpoint ? 0x80 : 0, &negative, format_char, cp, buf + sizeof(buf)); if (negative) sign = '-'; else if (flags() & ios::showpos) sign = '+'; if (*cp == 0) cp++; // Calculate padding. int fieldsize = size + fpprec; if (sign) fieldsize++; int padding = 0; int w = width(0); if (fieldsize < w) padding = w - fieldsize; // Do actual output. register streambuf* sbuf = rdbuf(); register i; char fill_char = fill(); ios::fmtflags pad_kind = flags() & (ios::left|ios::right|ios::internal); if (pad_kind != (ios::fmtflags)ios::left // Default (right) adjust. && pad_kind != (ios::fmtflags)ios::internal) for (i = padding; --i >= 0; ) sbuf->sputc(fill_char); if (sign) sbuf->sputc(sign); if (pad_kind == (ios::fmtflags)ios::internal) for (i = padding; --i >= 0; ) sbuf->sputc(fill_char); // Emit the actual concented field, followed by extra zeros. _IO_sputn (sbuf, cp, size); for (i = fpprec; --i >= 0; ) sbuf->sputc('0'); if (pad_kind == (ios::fmtflags)ios::left) // Left adjustment for (i = padding; --i >= 0; ) sbuf->sputc(fill_char);#endif osfx(); _IO_cleanup_region_end (0); } return *this;}/* Begin VxWorks specific */#ifndef _NO_LONG_DOUBLE_#if _G_HAVE_LONG_DOUBLE_IOostream& ostream::operator<<(long double n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); int format_char; if ((flags() & ios::floatfield) == ios::fixed) format_char = 'f'; else if ((flags() & ios::floatfield) == ios::scientific) format_char = flags() & ios::uppercase ? 'E' : 'e'; else format_char = flags() & ios::uppercase ? 'G' : 'g'; int prec = precision(); if (prec <= 0 && !(flags() & ios::fixed)) prec = 6; /* default */#if _G_HAVE_PRINTF_FP // Do actual conversion. struct printf_info info = { prec: prec, width: width(0), spec: format_char, is_long_double: 1, is_short: 0, is_long: 0, alt: (flags() & ios::showpoint) != 0, space: 0, left: (flags() & ios::left) != 0, showsign: (flags() & ios::showpos) != 0, group: 0, pad: fill()#if defined __GLIBC__ && __GLIBC__ >= 2 , extra: 0#endif }; const void *ptr = (const void *) &n; if (__printf_fp (rdbuf(), &info, &ptr) < 0) set (ios::badbit|ios::failbit);#else# error "long double I/O using dtoa or cvt_double is not implemented"#endif osfx(); _IO_cleanup_region_end (0); } return *this;}#endif#endif/* End VxWorks specific */ostream& ostream::operator<<(const char *s){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); if (s == NULL) s = "(null)"; int len = strlen(s); int w = width(0);// FIXME: Should we: if (w && len>w) len = w; char fill_char = fill(); register streambuf *sbuf = rdbuf(); register int padding = w > len ? w - len : 0; if (!(flags() & ios::left) && padding > 0) // Default adjustment. if (_IO_padn(sbuf, fill_char, padding) != padding) { set(ios::badbit); goto failed; } if (_IO_sputn (sbuf, s, len) != len) { set(ios::badbit); goto failed; } if (flags() & ios::left && padding > 0) // Left adjustment. if (_IO_padn(sbuf, fill_char, padding) != padding) set(ios::badbit); osfx(); failed: _IO_cleanup_region_end (0); } return *this;}#if 0ostream& ostream::operator<<(const void *p){ Is in osform.cc, to avoid pulling in all of _IO_vfprintf by this file. */ }#endifostream& ostream::operator<<(register streambuf* sbuf){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); char buffer[_IO_BUFSIZ]; register streambuf* outbuf = _strbuf; for (;;) { _IO_size_t count = _IO_sgetn(sbuf, buffer, _IO_BUFSIZ); if (count <= 0) break; if (_IO_sputn(outbuf, buffer, count) != count) { set(ios::badbit); break; } } osfx(); _IO_cleanup_region_end (0); } return *this;}ostream::ostream(streambuf* sb, ostream* tied){ init (sb, tied);}ostream& ostream::seekp(streampos pos){ pos = _strbuf->pubseekpos(pos, ios::out); if (pos == streampos(EOF)) set(ios::badbit); return *this;}ostream& ostream::seekp(streamoff off, _seek_dir dir){ streampos pos = _IO_seekoff (_strbuf, off, (int) dir, _IOS_OUTPUT); if (pos == streampos(EOF)) set(ios::badbit); return *this;}streampos ostream::tellp(){#if 1 streampos pos = _IO_seekoff (_strbuf, 0, _IO_seek_cur, _IOS_OUTPUT);#else streampos pos = _strbuf->pubseekoff(0, ios::cur, ios::out);#endif if (pos == streampos(EOF)) set(ios::badbit); return pos;}ostream& ostream::flush(){ if (_strbuf->sync()) set(ios::badbit); return *this;}ostream& flush(ostream& outs){ return outs.flush();}istream& ws(istream& ins){ if (ins.ipfx1()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, ins._strbuf); int ch = skip_ws(ins._strbuf); if (ch == EOF) ins.set(ios::eofbit); else ins._strbuf->sputbackc(ch); ins.isfx(); _IO_cleanup_region_end (0); } return ins;}// Skip white-space. Return 0 on failure (EOF), or 1 on success.// Differs from ws() manipulator in that failbit is set on EOF.// Called by ipfx() and ipfx0() if needed.int istream::_skip_ws(){ int ch = skip_ws(_strbuf); if (ch == EOF) { set(ios::eofbit|ios::failbit); return 0; } else { _strbuf->sputbackc(ch); return 1; }}ostream& ends(ostream& outs){ outs.put('\0'); return outs;}ostream& endl(ostream& outs){ return flush(outs.put('\n'));}istream& lock(istream& ins){ _IO_flockfile (ins._strbuf); return ins;}istream& unlock(istream& ins){ _IO_funlockfile (ins._strbuf); return ins;}ostream& lock(ostream& outs){ _IO_flockfile (outs._strbuf); return outs;}ostream& unlock(ostream& outs){ _IO_funlockfile (outs._strbuf); return outs;}ostream& ostream::write(const char *s, streamsize n){ if (opfx()) { _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, _strbuf); if (_IO_sputn(_strbuf, s, n) != n) set(ios::failbit); osfx(); _IO_cleanup_region_end (0); } return *this;}void ostream::do_osfx(){ if (flags() & ios::unitbuf) flush(); if (flags() & ios::stdio) { fflush(stdout); fflush(stderr); }}iostream::iostream(streambuf* sb, ostream* tied){ init (sb, tied);}// NOTE: extension for compatibility with old libg++.// Not really compatible with fistream::close().#ifdef _STREAM_COMPATvoid ios::close(){ if (_strbuf->_flags & _IO_IS_FILEBUF) ((struct filebuf*)rdbuf())->close(); else if (_strbuf != NULL) rdbuf()->sync(); _strbuf = NULL; _state = badbit;}int istream::skip(int i){ int old = (_flags & ios::skipws) != 0; if (i) _flags |= ios::skipws; else _flags &= ~ios::skipws; return old;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -