📄 streambuf.h
字号:
int readable(); int writable();#endif // Used to initialize standard streams. Not needed in this implementation. class Init { public: Init () { } }; protected: inline ios(streambuf* sb = 0, ostream* tie_to = 0); inline virtual ~ios(); inline void init(streambuf* sb, ostream* tie = 0);};#if __GNUG__==1typedef int _seek_dir;#elsetypedef ios::seek_dir _seek_dir;#endif// Magic numbers and bits for the _flags field.// The magic numbers use the high-order bits of _flags;// the remaining bits are abailable for variable flags.// Note: The magic numbers must all be negative if stdio// emulation is desired.// A streammarker remembers a position in a buffer.// You are guaranteed to be able to seek back to it if it is saving().class streammarker : private _IO_marker { friend class streambuf; void set_offset(int offset) { _pos = offset; } public: streammarker(streambuf *sb); ~streammarker(); int saving() { return 1; } int delta(streammarker&); int delta();};struct streambuf : public _IO_FILE { // protected?? friend class ios; friend class istream; friend class ostream; friend class streammarker; const void *&_vtable() { return *(const void**)((_IO_FILE*)this + 1); } protected: static streambuf* _list_all; /* List of open streambufs. */ _IO_FILE*& xchain() { return _chain; } void _un_link(); void _link_in(); char* gptr() const { return _IO_file_flags & _IO_IN_BACKUP ? _IO_save_base : _IO_read_ptr; } char* pptr() const { return _IO_write_ptr; } char* egptr() const { return _IO_file_flags & _IO_IN_BACKUP ? _IO_save_end : _IO_read_end; } char* epptr() const { return _IO_write_end; } char* pbase() const { return _IO_write_base; } char* eback() const { return _IO_file_flags & _IO_IN_BACKUP ? _IO_save_base : _IO_read_base;} char* base() const { return _IO_buf_base; } char* ebuf() const { return _IO_buf_end; } int blen() const { return _IO_buf_end - _IO_buf_base; } void xput_char(char c) { *_IO_write_ptr++ = c; } int xflags() { return _IO_file_flags; } int xflags(int f) {int fl = _IO_file_flags; _IO_file_flags = f; return fl;} void xsetflags(int f) { _IO_file_flags |= f; } void xsetflags(int f, int mask) { _IO_file_flags = (_IO_file_flags & ~mask) | (f & mask); } void gbump(int n) { _IO_file_flags & _IO_IN_BACKUP ? (_IO_save_base+=n):(_IO_read_ptr+=n);} void pbump(int n) { _IO_write_ptr += n; } void setb(char* b, char* eb, int a=0); void setp(char* p, char* ep) { _IO_write_base=_IO_write_ptr=p; _IO_write_end=ep; } void setg(char* eb, char* g, char *eg) { if (_IO_file_flags & _IO_IN_BACKUP) _IO_free_backup_area(this); _IO_read_base = eb; _IO_read_ptr = g; _IO_read_end = eg; } char *shortbuf() { return _shortbuf; } int in_backup() { return _flags & _IO_IN_BACKUP; } // The start of the main get area: FIXME: wrong for write-mode filebuf? char *Gbase() { return in_backup() ? _IO_save_base : _IO_read_base; } // The end of the main get area: char *eGptr() { return in_backup() ? _IO_save_end : _IO_read_end; } // The start of the backup area: char *Bbase() { return in_backup() ? _IO_read_base : _IO_save_base; } char *Bptr() { return _IO_backup_base; } // The end of the backup area: char *eBptr() { return in_backup() ? _IO_read_end : _IO_save_end; } char *Nbase() { return _IO_save_base; } char *eNptr() { return _IO_save_end; } int have_backup() { return _IO_save_base != NULL; } int have_markers() { return _markers != NULL; } void free_backup_area(); void unsave_markers(); // Make all streammarkers !saving(). int put_mode() { return _flags & _IO_CURRENTLY_PUTTING; } int switch_to_get_mode(); streambuf(int flags=0); public: static int flush_all(); static void flush_all_linebuffered(); // Flush all line buffered files. virtual ~streambuf(); virtual int overflow(int c = EOF); // Leave public for now virtual int underflow(); // Leave public for now virtual int uflow(); // Leave public for now virtual int pbackfail(int c);// virtual int showmany (); virtual streamsize xsputn(const char* s, streamsize n); virtual streamsize xsgetn(char* s, streamsize n); virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out); virtual streampos seekpos(streampos pos, int mode = ios::in|ios::out); streampos pubseekoff(streamoff o, _seek_dir d, int mode=ios::in|ios::out) { return _IO_seekoff (this, o, d, mode); } streampos pubseekpos(streampos pos, int mode = ios::in|ios::out) { return _IO_seekpos (this, pos, mode); } streampos sseekoff(streamoff, _seek_dir, int mode=ios::in|ios::out); streampos sseekpos(streampos pos, int mode = ios::in|ios::out); virtual streambuf* setbuf(char* p, int len); virtual int sync(); virtual int doallocate(); int seekmark(streammarker& mark, int delta = 0); int sputbackc(char c); int sungetc(); int unbuffered() { return _flags & _IO_UNBUFFERED ? 1 : 0; } int linebuffered() { return _flags & _IO_LINE_BUF ? 1 : 0; } void unbuffered(int i) { if (i) _flags |= _IO_UNBUFFERED; else _flags &= ~_IO_UNBUFFERED; } void linebuffered(int i) { if (i) _flags |= _IO_LINE_BUF; else _flags &= ~_IO_LINE_BUF; } int allocate() { // For AT&T compatibility if (base() || unbuffered()) return 0; else return doallocate(); } // Allocate a buffer if needed; use _shortbuf if appropriate. void allocbuf() { if (base() == NULL) doallocbuf(); } void doallocbuf(); int in_avail() { return _IO_read_end - _IO_read_ptr; } int out_waiting() { return _IO_write_ptr - _IO_write_base; } streamsize sputn(const char* s, streamsize n) { return xsputn(s, n); } streamsize padn(char pad, streamsize n) { return _IO_padn(this, pad, n); } streamsize sgetn(char* s, streamsize n) { return _IO_sgetn(this, s, n); } int ignore(int); int get_column(); int set_column(int); long sgetline(char* buf, _IO_size_t n, char delim, int putback_delim); int sputc(int c) { return _IO_putc(c, this); } int sbumpc() { return _IO_getc(this); } int sgetc() { return _IO_peekc(this); } int snextc() { if (_IO_read_ptr >= _IO_read_end && __underflow(this) == EOF) return EOF; else return _IO_read_ptr++, sgetc(); } void stossc() { if (_IO_read_ptr < _IO_read_end) _IO_read_ptr++; } int vscan(char const *fmt0, _IO_va_list ap, ios* stream = NULL); int scan(char const *fmt0 ...); int vform(char const *fmt0, _IO_va_list ap); int form(char const *fmt0 ...);#if 0 /* Work in progress */ int column(); // Current column number (of put pointer). -1 is unknown. void column(int c); // Set column number of put pointer to c.#endif virtual streamsize sys_read(char* buf, streamsize size); virtual streamsize sys_write(const char*, streamsize); virtual streampos sys_seek(streamoff, _seek_dir); virtual int sys_close(); virtual int sys_stat(void*); // Actually, a (struct stat*)#if _G_IO_IO_FILE_VERSION == 0x20001 virtual int showmanyc(); virtual void imbue(void *);#endif};// A backupbuf is a streambuf with full backup and savepoints on reading.// All standard streambufs in the GNU iostream library are backupbufs.class filebuf : public streambuf { protected: void init(); public: static const int openprot; // Non-ANSI AT&T-ism: Default open protection. filebuf(); filebuf(int fd); filebuf(int fd, char* p, int len);#if !_IO_UNIFIED_JUMPTABLES static filebuf *__new();#endif ~filebuf(); filebuf* attach(int fd); filebuf* open(const char *filename, const char *mode); filebuf* open(const char *filename, ios::openmode mode, int prot = 0664); virtual int underflow(); virtual int overflow(int c = EOF); int is_open() const { return _fileno >= 0; } int fd() const { return is_open() ? _fileno : EOF; } filebuf* close(); virtual int doallocate(); virtual streampos seekoff(streamoff, _seek_dir, int mode=ios::in|ios::out); virtual streambuf* setbuf(char* p, int len); streamsize xsputn(const char* s, streamsize n); streamsize xsgetn(char* s, streamsize n); virtual int sync(); protected: // See documentation in filebuf.C.// virtual int pbackfail(int c); int is_reading() { return eback() != egptr(); } char* cur_ptr() { return is_reading() ? gptr() : pptr(); } /* System's idea of pointer */ char* file_ptr() { return eGptr(); } // Low-level operations (Usually invoke system calls.) virtual streamsize sys_read(char* buf, streamsize size); virtual streampos sys_seek(streamoff, _seek_dir); virtual streamsize sys_write(const char*, streamsize); virtual int sys_stat(void*); // Actually, a (struct stat*) virtual int sys_close();#if 0 virtual uflow; virtual showmany;#endif};inline void ios::init(streambuf* sb, ostream* tie_to) { _state = sb ? ios::goodbit : ios::badbit; _exceptions=0; _strbuf=sb; _tie = tie_to; _width=0; _fill=' ';#ifdef _IO_NEW_STREAMS _flags=ios::skipws|ios::dec;#else _flags=ios::skipws|ios::dec|ios::dont_close;#endif _precision=6; _arrays = 0; }inline ios::ios(streambuf* sb, ostream* tie_to) { init(sb, tie_to); }inline ios::~ios() {#ifndef _IO_NEW_STREAMS if (!(_flags & (unsigned int)ios::dont_close)) delete rdbuf();#endif if (_arrays) delete [] _arrays;}} // extern "C++"#endif /* _STREAMBUF_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -