⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 std_fstream.h

📁 c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出版社的光盘
💻 H
字号:
// File based streams -*- C++ -*-// Copyright (C) 1997-1999 Cygnus Solutions//// This file is part of the GNU ISO C++ Library.  This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING.  If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction.  Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License.  This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License.//// ISO C++ 14882: 27.8  File-based streams//#ifndef _CPP_FSTREAM#define _CPP_FSTREAM	1#include <bits/std_istream.h>#include <bits/std_ostream.h>#include <bits/basic_file.h>#include <bits/std_locale.h>	// For codecvtnamespace std {  template<typename _CharT, typename _Traits>    class basic_filebuf : public basic_streambuf<_CharT, _Traits>    {      // Types:      typedef _CharT                     	       	  char_type;      typedef typename _Traits::int_type 		  int_type;      typedef typename _Traits::pos_type 		  pos_type;      typedef typename _Traits::off_type 		  off_type;      typedef _Traits                    		  traits_type;      // Non-standard Types:      typedef basic_streambuf<_CharT, _Traits> 		  __streambuf_type;      typedef basic_filebuf<_CharT, _Traits>		  __filebuf_type;      typedef __basic_file				  __file_type;      typedef typename _Traits::state_type                __state_type;      typedef codecvt<_CharT, char, __state_type>         __codecvt_type;      typedef codecvt<_CharT, char, __state_type>::result __res_type;            // Data Members:      __file_type* 		_M_file;      bool			_M_last_overflowed;  // XXX Needed?      __state_type		_M_state_cur;// Current state type for codecvt.      __state_type 		_M_state_beg; 	      const __codecvt_type*	_M_fcvt;       // Cached value from use_facet.    public:      // Constructors/destructor:      basic_filebuf();      // Non-standard ctor:      basic_filebuf(int __fd, const char* __name = "unknown", 		    ios_base::openmode __mode = ios_base::in | ios_base::out);      virtual       ~basic_filebuf()       { 	this->close();	_M_fcvt = NULL;	delete _M_file;	_M_file = NULL;	_M_last_overflowed = false;      }      // Members:      bool       is_open() const { return _M_file->is_open(); }          __filebuf_type*       open(const char* __s, ios_base::openmode __mode);          __filebuf_type*       close();    protected:      // Common initialization code for both ctors goes here.      void      _M_init_filebuf(void);      // Overridden virtual functions:      virtual streamsize       showmanyc();         // Stroustrup, 1998, p. 628       // underflow() and uflow() functions are called to get the next      // charater from the real input source when the buffer is empty.      // Buffered input uses underflow()      virtual int_type       underflow();      virtual int_type       pbackfail(int_type __c = _Traits::eof());      // NB: For what the standard expects of the overflow function,      // see _M_really_overflow(), below. Because basic_streambuf's      // sputc/sputn call overflow directly, and the complications of      // this implementation's setting of the initial pointers all      // equal to _M_buf when initializing, it seems essential to have      // this in actuality be a helper function that checks for the      // eccentricities of this implementation, and then call      // overflow() if indeed the buffer is full.      virtual int_type       overflow(int_type __c = _Traits::eof());      // Stroustrup, 1998, p 648      // The overflow() function is called to transfer characters to the      // real output destination when the buffer is full. A call to      // overflow(c) outputs the contents of the buffer plus the      // character c.      // 27.5.2.4.5       // Consume some sequence of the characters in the pending sequence.      int_type       _M_really_overflow(int_type __c = _Traits::eof());          virtual __streambuf_type*       setbuf(char_type* __s, streamsize __n)      {	if (!this->is_open() && __s == 0 && __n == 0)	  _M_buf_size = 0;	_M_last_overflowed = false;		return this;       }          virtual pos_type       seekoff(off_type __off, ios_base::seekdir __way,	      ios_base::openmode __mode = ios_base::in | ios_base::out);      virtual pos_type       seekpos(pos_type __pos,	       ios_base::openmode __mode = ios_base::in | ios_base::out)      {	pos_type __retval =  this->seekoff(__pos, ios_base::beg, __mode); 	_M_last_overflowed = false;		return __retval;      }      virtual int       sync()      {	// Don't do anything about input sequences.	bool __testput = _M_out_cur && _M_out_beg < _M_out_cur;	if (__testput)	  {	    // Iff _M_mode is ios_base::out only, then need to set out	    // pointers to the end of the current put sequence before	    // we call _M_really_overflow, or else the stream will not be	    // flushed. Back up, so overflow doesn't append extra characters.	    this->_M_really_overflow();	  }	_M_file->sync();	_M_last_overflowed = false;		return 0;      }            virtual void       imbue(const locale& __loc);      void      _M_output_unshift();    };  typedef basic_filebuf<char> filebuf;  typedef basic_filebuf<wchar_t> wfilebuf;  // 27.8.1.5  Template class basic_ifstream  template<typename _CharT, typename _Traits>    class basic_ifstream : public basic_istream<_CharT, _Traits>    {      // Types:      typedef _CharT 				char_type;      typedef typename _Traits::int_type 	int_type;      typedef typename _Traits::pos_type 	pos_type;      typedef typename _Traits::off_type 	off_type;      typedef _Traits 				traits_type;      // Non-standard types:      typedef basic_filebuf<_CharT, _Traits> 	__filebuf_type;      typedef basic_istream<_CharT, _Traits>	__istream_type;        public:      // Constructors/Destructors:      basic_ifstream()      : __istream_type(new __filebuf_type())      { }      explicit       basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)      : __istream_type(new __filebuf_type())      { this->open(__s, __mode); }          ~basic_ifstream()      { 	delete _M_streambuf; 	_M_streambuf = NULL;      }      // Members:      __filebuf_type*       rdbuf() const       { return static_cast<__filebuf_type*>(_M_streambuf); }      bool       is_open() { return rdbuf()->is_open(); }      void       open(const char* __s, ios_base::openmode __mode = ios_base::in)      { 	if (!rdbuf()->open(__s, __mode))	  this->setstate(ios_base::failbit);       }      void       close()      { 	if (!rdbuf()->close())	  this->setstate(ios_base::failbit);	      }    };    // 27.8.1.8  Template class basic_ofstream  template<typename _CharT, typename _Traits>    class basic_ofstream : public basic_ostream<_CharT,_Traits>    {       // Types:      typedef _CharT 				char_type;      typedef typename _Traits::int_type 	int_type;      typedef typename _Traits::pos_type 	pos_type;      typedef typename _Traits::off_type 	off_type;      typedef _Traits 				traits_type;      // Non-standard types:      typedef basic_filebuf<_CharT, _Traits> 	__filebuf_type;      typedef basic_ostream<_CharT, _Traits>	__ostream_type;         public:      // Constructors:      basic_ofstream()      : __ostream_type(new __filebuf_type())      { }            explicit       basic_ofstream(const char* __s, 		     ios_base::openmode __mode = ios_base::out|ios_base::trunc)      : __ostream_type(new __filebuf_type())      { this->open(__s, __mode); }      ~basic_ofstream()      { 	delete _M_streambuf; 	_M_streambuf = NULL;      }      // Members:      __filebuf_type*       rdbuf() const      { return static_cast<__filebuf_type*>(_M_streambuf); }       bool       is_open() { return rdbuf()->is_open(); }      void       open(const char* __s, 	   ios_base::openmode __mode = ios_base::out | ios_base::trunc)      { 	if (!rdbuf()->open(__s, __mode))	  this->setstate (ios_base::failbit);       }      void       close()      { 	if (!rdbuf()->close())	  setstate (ios_base::failbit);       }    };  typedef basic_ofstream<char> ofstream;  typedef basic_ofstream<wchar_t> wofstream;    // 27.8.1.11  Template class basic_fstream  template<typename _CharT, typename _Traits>    class basic_fstream : public basic_iostream<_CharT, _Traits>    {       // Types:      typedef _CharT 				char_type;      typedef typename _Traits::int_type 	int_type;      typedef typename _Traits::pos_type 	pos_type;      typedef typename _Traits::off_type 	off_type;      typedef _Traits 				traits_type;      // Non-standard types:      typedef basic_filebuf<_CharT, _Traits> 	__filebuf_type;      typedef basic_ios<_CharT, _Traits>	__ios_type;      typedef basic_iostream<_CharT, _Traits>	__iostream_type;    public:      // Constructors/destructor:      basic_fstream()      : __iostream_type(new __filebuf_type())      { }      explicit       basic_fstream(const char* __s,		    ios_base::openmode __mode = ios_base::in | ios_base::out)      : __iostream_type(new __filebuf_type())      { this->open(__s, __mode); }      ~basic_fstream()      { 	delete _M_streambuf; 	_M_streambuf = NULL;      }          // Members:      __filebuf_type*       rdbuf() const       { return static_cast<__filebuf_type*>(_M_streambuf); }      bool       is_open() { return rdbuf()->is_open(); }      void       open(const char* __s, 	   ios_base::openmode __mode = ios_base::in | ios_base::out)      { 	if (!rdbuf()->open(__s, __mode))	  setstate (ios_base::failbit);       }      void       close()      { 	if (!rdbuf()->close())	  setstate (ios_base::failbit);       }    };  typedef basic_fstream<char> fstream;  typedef basic_fstream<wchar_t> wfstream;} // namespace std#ifdef _GLIBCPP_NO_TEMPLATE_EXPORT# define export# include <bits/fstream.tcc>#endif#endif	/* _CPP_FSTREAM */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -