1// File based streams -*- C++ -*-
2
3// Copyright (C) 1997-2014 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file include/fstream
26 *  This is a Standard C++ Library header.
27 */
28
29//
30// ISO C++ 14882: 27.8  File-based streams
31//
32
33#ifndef _GLIBCXX_FSTREAM
34#define _GLIBCXX_FSTREAM 1
35
36#pragma GCC system_header
37
38#include <istream>
39#include <ostream>
40#include <bits/codecvt.h>
41#include <cstdio>             // For BUFSIZ
42#include <bits/basic_file.h>  // For __basic_file, __c_lock
43#if __cplusplus >= 201103L
44#include <string>             // For std::string overloads.
45#endif
46
47namespace std _GLIBCXX_VISIBILITY(default)
48{
49_GLIBCXX_BEGIN_NAMESPACE_VERSION
50
51  // [27.8.1.1] template class basic_filebuf
52  /**
53   *  @brief  The actual work of input and output (for files).
54   *  @ingroup io
55   *
56   *  @tparam _CharT  Type of character stream.
57   *  @tparam _Traits  Traits for character type, defaults to
58   *                   char_traits<_CharT>.
59   *
60   *  This class associates both its input and output sequence with an
61   *  external disk file, and maintains a joint file position for both
62   *  sequences.  Many of its semantics are described in terms of similar
63   *  behavior in the Standard C Library's @c FILE streams.
64   *
65   *  Requirements on traits_type, specific to this class:
66   *  - traits_type::pos_type must be fpos<traits_type::state_type>
67   *  - traits_type::off_type must be streamoff
68   *  - traits_type::state_type must be Assignable and DefaultConstructible,
69   *  - traits_type::state_type() must be the initial state for codecvt.
70   */
71  template<typename _CharT, typename _Traits>
72    class basic_filebuf : public basic_streambuf<_CharT, _Traits>
73    {
74    public:
75      // Types:
76      typedef _CharT                     	        char_type;
77      typedef _Traits                    	        traits_type;
78      typedef typename traits_type::int_type 		int_type;
79      typedef typename traits_type::pos_type 		pos_type;
80      typedef typename traits_type::off_type 		off_type;
81
82      typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;
83      typedef basic_filebuf<char_type, traits_type>     __filebuf_type;
84      typedef __basic_file<char>		        __file_type;
85      typedef typename traits_type::state_type          __state_type;
86      typedef codecvt<char_type, char, __state_type>    __codecvt_type;
87
88      friend class ios_base; // For sync_with_stdio.
89
90    protected:
91      // Data Members:
92      // MT lock inherited from libio or other low-level io library.
93      __c_lock          	_M_lock;
94
95      // External buffer.
96      __file_type 		_M_file;
97
98      /// Place to stash in || out || in | out settings for current filebuf.
99      ios_base::openmode 	_M_mode;
100
101      // Beginning state type for codecvt.
102      __state_type 		_M_state_beg;
103
104      // During output, the state that corresponds to pptr(),
105      // during input, the state that corresponds to egptr() and
106      // _M_ext_next.
107      __state_type		_M_state_cur;
108
109      // Not used for output. During input, the state that corresponds
110      // to eback() and _M_ext_buf.
111      __state_type		_M_state_last;
112
113      /// Pointer to the beginning of internal buffer.
114      char_type*		_M_buf;
115
116      /**
117       *  Actual size of internal buffer. This number is equal to the size
118       *  of the put area + 1 position, reserved for the overflow char of
119       *  a full area.
120       */
121      size_t			_M_buf_size;
122
123      // Set iff _M_buf is allocated memory from _M_allocate_internal_buffer.
124      bool			_M_buf_allocated;
125
126      /**
127       *  _M_reading == false && _M_writing == false for @b uncommitted mode;
128       *  _M_reading == true for @b read mode;
129       *  _M_writing == true for @b write mode;
130       *
131       *  NB: _M_reading == true && _M_writing == true is unused.
132       */
133      bool                      _M_reading;
134      bool                      _M_writing;
135
136      //@{
137      /**
138       *  Necessary bits for putback buffer management.
139       *
140       *  @note pbacks of over one character are not currently supported.
141       */
142      char_type			_M_pback;
143      char_type*		_M_pback_cur_save;
144      char_type*		_M_pback_end_save;
145      bool			_M_pback_init;
146      //@}
147
148      // Cached codecvt facet.
149      const __codecvt_type* 	_M_codecvt;
150
151      /**
152       *  Buffer for external characters. Used for input when
153       *  codecvt::always_noconv() == false. When valid, this corresponds
154       *  to eback().
155       */
156      char*			_M_ext_buf;
157
158      /**
159       *  Size of buffer held by _M_ext_buf.
160       */
161      streamsize		_M_ext_buf_size;
162
163      /**
164       *  Pointers into the buffer held by _M_ext_buf that delimit a
165       *  subsequence of bytes that have been read but not yet converted.
166       *  When valid, _M_ext_next corresponds to egptr().
167       */
168      const char*		_M_ext_next;
169      char*			_M_ext_end;
170
171      /**
172       *  Initializes pback buffers, and moves normal buffers to safety.
173       *  Assumptions:
174       *  _M_in_cur has already been moved back
175       */
176      void
177      _M_create_pback()
178      {
179	if (!_M_pback_init)
180	  {
181	    _M_pback_cur_save = this->gptr();
182	    _M_pback_end_save = this->egptr();
183	    this->setg(&_M_pback, &_M_pback, &_M_pback + 1);
184	    _M_pback_init = true;
185	  }
186      }
187
188      /**
189       *  Deactivates pback buffer contents, and restores normal buffer.
190       *  Assumptions:
191       *  The pback buffer has only moved forward.
192       */
193      void
194      _M_destroy_pback() throw()
195      {
196	if (_M_pback_init)
197	  {
198	    // Length _M_in_cur moved in the pback buffer.
199	    _M_pback_cur_save += this->gptr() != this->eback();
200	    this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save);
201	    _M_pback_init = false;
202	  }
203      }
204
205    public:
206      // Constructors/destructor:
207      /**
208       *  @brief  Does not open any files.
209       *
210       *  The default constructor initializes the parent class using its
211       *  own default ctor.
212       */
213      basic_filebuf();
214
215      /**
216       *  @brief  The destructor closes the file first.
217       */
218      virtual
219      ~basic_filebuf()
220      { this->close(); }
221
222      // Members:
223      /**
224       *  @brief  Returns true if the external file is open.
225       */
226      bool
227      is_open() const throw()
228      { return _M_file.is_open(); }
229
230      /**
231       *  @brief  Opens an external file.
232       *  @param  __s  The name of the file.
233       *  @param  __mode  The open mode flags.
234       *  @return  @c this on success, NULL on failure
235       *
236       *  If a file is already open, this function immediately fails.
237       *  Otherwise it tries to open the file named @a __s using the flags
238       *  given in @a __mode.
239       *
240       *  Table 92, adapted here, gives the relation between openmode
241       *  combinations and the equivalent @c fopen() flags.
242       *  (NB: lines app, in|out|app, in|app, binary|app, binary|in|out|app,
243       *  and binary|in|app per DR 596)
244       *  <pre>
245       *  +---------------------------------------------------------+
246       *  | ios_base Flag combination            stdio equivalent   |
247       *  |binary  in  out  trunc  app                              |
248       *  +---------------------------------------------------------+
249       *  |             +                        w                  |
250       *  |             +           +            a                  |
251       *  |                         +            a                  |
252       *  |             +     +                  w                  |
253       *  |         +                            r                  |
254       *  |         +   +                        r+                 |
255       *  |         +   +     +                  w+                 |
256       *  |         +   +           +            a+                 |
257       *  |         +               +            a+                 |
258       *  +---------------------------------------------------------+
259       *  |   +         +                        wb                 |
260       *  |   +         +           +            ab                 |
261       *  |   +                     +            ab                 |
262       *  |   +         +     +                  wb                 |
263       *  |   +     +                            rb                 |
264       *  |   +     +   +                        r+b                |
265       *  |   +     +   +     +                  w+b                |
266       *  |   +     +   +           +            a+b                |
267       *  |   +     +               +            a+b                |
268       *  +---------------------------------------------------------+
269       *  </pre>
270       */
271      __filebuf_type*
272      open(const char* __s, ios_base::openmode __mode);
273
274#if __cplusplus >= 201103L
275      /**
276       *  @brief  Opens an external file.
277       *  @param  __s  The name of the file.
278       *  @param  __mode  The open mode flags.
279       *  @return  @c this on success, NULL on failure
280       */
281      __filebuf_type*
282      open(const std::string& __s, ios_base::openmode __mode)
283      { return open(__s.c_str(), __mode); }
284#endif
285
286      /**
287       *  @brief  Closes the currently associated file.
288       *  @return  @c this on success, NULL on failure
289       *
290       *  If no file is currently open, this function immediately fails.
291       *
292       *  If a <em>put buffer area</em> exists, @c overflow(eof) is
293       *  called to flush all the characters.  The file is then
294       *  closed.
295       *
296       *  If any operations fail, this function also fails.
297       */
298      __filebuf_type*
299      close();
300
301    protected:
302      void
303      _M_allocate_internal_buffer();
304
305      void
306      _M_destroy_internal_buffer() throw();
307
308      // [27.8.1.4] overridden virtual functions
309      virtual streamsize
310      showmanyc();
311
312      // Stroustrup, 1998, p. 628
313      // underflow() and uflow() functions are called to get the next
314      // character from the real input source when the buffer is empty.
315      // Buffered input uses underflow()
316
317      virtual int_type
318      underflow();
319
320      virtual int_type
321      pbackfail(int_type __c = _Traits::eof());
322
323      // Stroustrup, 1998, p 648
324      // The overflow() function is called to transfer characters to the
325      // real output destination when the buffer is full. A call to
326      // overflow(c) outputs the contents of the buffer plus the
327      // character c.
328      // 27.5.2.4.5
329      // Consume some sequence of the characters in the pending sequence.
330      virtual int_type
331      overflow(int_type __c = _Traits::eof());
332
333      // Convert internal byte sequence to external, char-based
334      // sequence via codecvt.
335      bool
336      _M_convert_to_external(char_type*, streamsize);
337
338      /**
339       *  @brief  Manipulates the buffer.
340       *  @param  __s  Pointer to a buffer area.
341       *  @param  __n  Size of @a __s.
342       *  @return  @c this
343       *
344       *  If no file has been opened, and both @a __s and @a __n are zero, then
345       *  the stream becomes unbuffered.  Otherwise, @c __s is used as a
346       *  buffer; see
347       *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt11ch25s02.html
348       *  for more.
349       */
350      virtual __streambuf_type*
351      setbuf(char_type* __s, streamsize __n);
352
353      virtual pos_type
354      seekoff(off_type __off, ios_base::seekdir __way,
355	      ios_base::openmode __mode = ios_base::in | ios_base::out);
356
357      virtual pos_type
358      seekpos(pos_type __pos,
359	      ios_base::openmode __mode = ios_base::in | ios_base::out);
360
361      // Common code for seekoff, seekpos, and overflow
362      pos_type
363      _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state);
364
365      int
366      _M_get_ext_pos(__state_type &__state);
367
368      virtual int
369      sync();
370
371      virtual void
372      imbue(const locale& __loc);
373
374      virtual streamsize
375      xsgetn(char_type* __s, streamsize __n);
376
377      virtual streamsize
378      xsputn(const char_type* __s, streamsize __n);
379
380      // Flushes output buffer, then writes unshift sequence.
381      bool
382      _M_terminate_output();
383
384      /**
385       *  This function sets the pointers of the internal buffer, both get
386       *  and put areas. Typically:
387       *
388       *   __off == egptr() - eback() upon underflow/uflow (@b read mode);
389       *   __off == 0 upon overflow (@b write mode);
390       *   __off == -1 upon open, setbuf, seekoff/pos (@b uncommitted mode).
391       *
392       *  NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size
393       *  reflects the actual allocated memory and the last cell is reserved
394       *  for the overflow char of a full put area.
395       */
396      void
397      _M_set_buffer(streamsize __off)
398      {
399	const bool __testin = _M_mode & ios_base::in;
400	const bool __testout = (_M_mode & ios_base::out
401				|| _M_mode & ios_base::app);
402
403	if (__testin && __off > 0)
404	  this->setg(_M_buf, _M_buf, _M_buf + __off);
405	else
406	  this->setg(_M_buf, _M_buf, _M_buf);
407
408	if (__testout && __off == 0 && _M_buf_size > 1 )
409	  this->setp(_M_buf, _M_buf + _M_buf_size - 1);
410	else
411	  this->setp(0, 0);
412      }
413    };
414
415  // [27.8.1.5] Template class basic_ifstream
416  /**
417   *  @brief  Controlling input for files.
418   *  @ingroup io
419   *
420   *  @tparam _CharT  Type of character stream.
421   *  @tparam _Traits  Traits for character type, defaults to
422   *                   char_traits<_CharT>.
423   *
424   *  This class supports reading from named files, using the inherited
425   *  functions from std::basic_istream.  To control the associated
426   *  sequence, an instance of std::basic_filebuf is used, which this page
427   *  refers to as @c sb.
428   */
429  template<typename _CharT, typename _Traits>
430    class basic_ifstream : public basic_istream<_CharT, _Traits>
431    {
432    public:
433      // Types:
434      typedef _CharT 					char_type;
435      typedef _Traits 					traits_type;
436      typedef typename traits_type::int_type 		int_type;
437      typedef typename traits_type::pos_type 		pos_type;
438      typedef typename traits_type::off_type 		off_type;
439
440      // Non-standard types:
441      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
442      typedef basic_istream<char_type, traits_type>	__istream_type;
443
444    private:
445      __filebuf_type	_M_filebuf;
446
447    public:
448      // Constructors/Destructors:
449      /**
450       *  @brief  Default constructor.
451       *
452       *  Initializes @c sb using its default constructor, and passes
453       *  @c &sb to the base class initializer.  Does not open any files
454       *  (you haven't given it a filename to open).
455       */
456      basic_ifstream() : __istream_type(), _M_filebuf()
457      { this->init(&_M_filebuf); }
458
459      /**
460       *  @brief  Create an input file stream.
461       *  @param  __s  Null terminated string specifying the filename.
462       *  @param  __mode  Open file in specified mode (see std::ios_base).
463       *
464       *  @c ios_base::in is automatically included in @a __mode.
465       *
466       *  Tip:  When using std::string to hold the filename, you must use
467       *  .c_str() before passing it to this constructor.
468       */
469      explicit
470      basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)
471      : __istream_type(), _M_filebuf()
472      {
473	this->init(&_M_filebuf);
474	this->open(__s, __mode);
475      }
476
477#if __cplusplus >= 201103L
478      /**
479       *  @brief  Create an input file stream.
480       *  @param  __s  std::string specifying the filename.
481       *  @param  __mode  Open file in specified mode (see std::ios_base).
482       *
483       *  @c ios_base::in is automatically included in @a __mode.
484       */
485      explicit
486      basic_ifstream(const std::string& __s,
487		     ios_base::openmode __mode = ios_base::in)
488      : __istream_type(), _M_filebuf()
489      {
490	this->init(&_M_filebuf);
491	this->open(__s, __mode);
492      }
493#endif
494
495      /**
496       *  @brief  The destructor does nothing.
497       *
498       *  The file is closed by the filebuf object, not the formatting
499       *  stream.
500       */
501      ~basic_ifstream()
502      { }
503
504      // Members:
505      /**
506       *  @brief  Accessing the underlying buffer.
507       *  @return  The current basic_filebuf buffer.
508       *
509       *  This hides both signatures of std::basic_ios::rdbuf().
510       */
511      __filebuf_type*
512      rdbuf() const
513      { return const_cast<__filebuf_type*>(&_M_filebuf); }
514
515      /**
516       *  @brief  Wrapper to test for an open file.
517       *  @return  @c rdbuf()->is_open()
518       */
519      bool
520      is_open()
521      { return _M_filebuf.is_open(); }
522
523      // _GLIBCXX_RESOLVE_LIB_DEFECTS
524      // 365. Lack of const-qualification in clause 27
525      bool
526      is_open() const
527      { return _M_filebuf.is_open(); }
528
529      /**
530       *  @brief  Opens an external file.
531       *  @param  __s  The name of the file.
532       *  @param  __mode  The open mode flags.
533       *
534       *  Calls @c std::basic_filebuf::open(s,__mode|in).  If that function
535       *  fails, @c failbit is set in the stream's error state.
536       *
537       *  Tip:  When using std::string to hold the filename, you must use
538       *  .c_str() before passing it to this constructor.
539       */
540      void
541      open(const char* __s, ios_base::openmode __mode = ios_base::in)
542      {
543	if (!_M_filebuf.open(__s, __mode | ios_base::in))
544	  this->setstate(ios_base::failbit);
545	else
546	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
547	  // 409. Closing an fstream should clear error state
548	  this->clear();
549      }
550
551#if __cplusplus >= 201103L
552      /**
553       *  @brief  Opens an external file.
554       *  @param  __s  The name of the file.
555       *  @param  __mode  The open mode flags.
556       *
557       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
558       *  fails, @c failbit is set in the stream's error state.
559       */
560      void
561      open(const std::string& __s, ios_base::openmode __mode = ios_base::in)
562      {
563	if (!_M_filebuf.open(__s, __mode | ios_base::in))
564	  this->setstate(ios_base::failbit);
565	else
566	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
567	  // 409. Closing an fstream should clear error state
568	  this->clear();
569      }
570#endif
571
572      /**
573       *  @brief  Close the file.
574       *
575       *  Calls @c std::basic_filebuf::close().  If that function
576       *  fails, @c failbit is set in the stream's error state.
577       */
578      void
579      close()
580      {
581	if (!_M_filebuf.close())
582	  this->setstate(ios_base::failbit);
583      }
584    };
585
586
587  // [27.8.1.8] Template class basic_ofstream
588  /**
589   *  @brief  Controlling output for files.
590   *  @ingroup io
591   *
592   *  @tparam _CharT  Type of character stream.
593   *  @tparam _Traits  Traits for character type, defaults to
594   *                   char_traits<_CharT>.
595   *
596   *  This class supports reading from named files, using the inherited
597   *  functions from std::basic_ostream.  To control the associated
598   *  sequence, an instance of std::basic_filebuf is used, which this page
599   *  refers to as @c sb.
600   */
601  template<typename _CharT, typename _Traits>
602    class basic_ofstream : public basic_ostream<_CharT,_Traits>
603    {
604    public:
605      // Types:
606      typedef _CharT 					char_type;
607      typedef _Traits 					traits_type;
608      typedef typename traits_type::int_type 		int_type;
609      typedef typename traits_type::pos_type 		pos_type;
610      typedef typename traits_type::off_type 		off_type;
611
612      // Non-standard types:
613      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
614      typedef basic_ostream<char_type, traits_type>	__ostream_type;
615
616    private:
617      __filebuf_type	_M_filebuf;
618
619    public:
620      // Constructors:
621      /**
622       *  @brief  Default constructor.
623       *
624       *  Initializes @c sb using its default constructor, and passes
625       *  @c &sb to the base class initializer.  Does not open any files
626       *  (you haven't given it a filename to open).
627       */
628      basic_ofstream(): __ostream_type(), _M_filebuf()
629      { this->init(&_M_filebuf); }
630
631      /**
632       *  @brief  Create an output file stream.
633       *  @param  __s  Null terminated string specifying the filename.
634       *  @param  __mode  Open file in specified mode (see std::ios_base).
635       *
636       *  @c ios_base::out | @c ios_base::trunc is automatically included in
637       *  @a __mode.
638       *
639       *  Tip:  When using std::string to hold the filename, you must use
640       *  .c_str() before passing it to this constructor.
641       */
642      explicit
643      basic_ofstream(const char* __s,
644		     ios_base::openmode __mode = ios_base::out|ios_base::trunc)
645      : __ostream_type(), _M_filebuf()
646      {
647	this->init(&_M_filebuf);
648	this->open(__s, __mode);
649      }
650
651#if __cplusplus >= 201103L
652      /**
653       *  @brief  Create an output file stream.
654       *  @param  __s  std::string specifying the filename.
655       *  @param  __mode  Open file in specified mode (see std::ios_base).
656       *
657       *  @c ios_base::out | @c ios_base::trunc is automatically included in
658       *  @a __mode.
659       */
660      explicit
661      basic_ofstream(const std::string& __s,
662		     ios_base::openmode __mode = ios_base::out|ios_base::trunc)
663      : __ostream_type(), _M_filebuf()
664      {
665	this->init(&_M_filebuf);
666	this->open(__s, __mode);
667      }
668#endif
669
670      /**
671       *  @brief  The destructor does nothing.
672       *
673       *  The file is closed by the filebuf object, not the formatting
674       *  stream.
675       */
676      ~basic_ofstream()
677      { }
678
679      // Members:
680      /**
681       *  @brief  Accessing the underlying buffer.
682       *  @return  The current basic_filebuf buffer.
683       *
684       *  This hides both signatures of std::basic_ios::rdbuf().
685       */
686      __filebuf_type*
687      rdbuf() const
688      { return const_cast<__filebuf_type*>(&_M_filebuf); }
689
690      /**
691       *  @brief  Wrapper to test for an open file.
692       *  @return  @c rdbuf()->is_open()
693       */
694      bool
695      is_open()
696      { return _M_filebuf.is_open(); }
697
698      // _GLIBCXX_RESOLVE_LIB_DEFECTS
699      // 365. Lack of const-qualification in clause 27
700      bool
701      is_open() const
702      { return _M_filebuf.is_open(); }
703
704      /**
705       *  @brief  Opens an external file.
706       *  @param  __s  The name of the file.
707       *  @param  __mode  The open mode flags.
708       *
709       *  Calls @c std::basic_filebuf::open(__s,__mode|out|trunc).  If that
710       *  function fails, @c failbit is set in the stream's error state.
711       *
712       *  Tip:  When using std::string to hold the filename, you must use
713       *  .c_str() before passing it to this constructor.
714       */
715      void
716      open(const char* __s,
717	   ios_base::openmode __mode = ios_base::out | ios_base::trunc)
718      {
719	if (!_M_filebuf.open(__s, __mode | ios_base::out))
720	  this->setstate(ios_base::failbit);
721	else
722	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
723	  // 409. Closing an fstream should clear error state
724	  this->clear();
725      }
726
727#if __cplusplus >= 201103L
728      /**
729       *  @brief  Opens an external file.
730       *  @param  __s  The name of the file.
731       *  @param  __mode  The open mode flags.
732       *
733       *  Calls @c std::basic_filebuf::open(s,mode|out|trunc).  If that
734       *  function fails, @c failbit is set in the stream's error state.
735       */
736      void
737      open(const std::string& __s,
738	   ios_base::openmode __mode = ios_base::out | ios_base::trunc)
739      {
740	if (!_M_filebuf.open(__s, __mode | ios_base::out))
741	  this->setstate(ios_base::failbit);
742	else
743	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
744	  // 409. Closing an fstream should clear error state
745	  this->clear();
746      }
747#endif
748
749      /**
750       *  @brief  Close the file.
751       *
752       *  Calls @c std::basic_filebuf::close().  If that function
753       *  fails, @c failbit is set in the stream's error state.
754       */
755      void
756      close()
757      {
758	if (!_M_filebuf.close())
759	  this->setstate(ios_base::failbit);
760      }
761    };
762
763
764  // [27.8.1.11] Template class basic_fstream
765  /**
766   *  @brief  Controlling input and output for files.
767   *  @ingroup io
768   *
769   *  @tparam _CharT  Type of character stream.
770   *  @tparam _Traits  Traits for character type, defaults to
771   *                   char_traits<_CharT>.
772   *
773   *  This class supports reading from and writing to named files, using
774   *  the inherited functions from std::basic_iostream.  To control the
775   *  associated sequence, an instance of std::basic_filebuf is used, which
776   *  this page refers to as @c sb.
777   */
778  template<typename _CharT, typename _Traits>
779    class basic_fstream : public basic_iostream<_CharT, _Traits>
780    {
781    public:
782      // Types:
783      typedef _CharT 					char_type;
784      typedef _Traits 					traits_type;
785      typedef typename traits_type::int_type 		int_type;
786      typedef typename traits_type::pos_type 		pos_type;
787      typedef typename traits_type::off_type 		off_type;
788
789      // Non-standard types:
790      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
791      typedef basic_ios<char_type, traits_type>		__ios_type;
792      typedef basic_iostream<char_type, traits_type>	__iostream_type;
793
794    private:
795      __filebuf_type	_M_filebuf;
796
797    public:
798      // Constructors/destructor:
799      /**
800       *  @brief  Default constructor.
801       *
802       *  Initializes @c sb using its default constructor, and passes
803       *  @c &sb to the base class initializer.  Does not open any files
804       *  (you haven't given it a filename to open).
805       */
806      basic_fstream()
807      : __iostream_type(), _M_filebuf()
808      { this->init(&_M_filebuf); }
809
810      /**
811       *  @brief  Create an input/output file stream.
812       *  @param  __s  Null terminated string specifying the filename.
813       *  @param  __mode  Open file in specified mode (see std::ios_base).
814       *
815       *  Tip:  When using std::string to hold the filename, you must use
816       *  .c_str() before passing it to this constructor.
817       */
818      explicit
819      basic_fstream(const char* __s,
820		    ios_base::openmode __mode = ios_base::in | ios_base::out)
821      : __iostream_type(0), _M_filebuf()
822      {
823	this->init(&_M_filebuf);
824	this->open(__s, __mode);
825      }
826
827#if __cplusplus >= 201103L
828      /**
829       *  @brief  Create an input/output file stream.
830       *  @param  __s  Null terminated string specifying the filename.
831       *  @param  __mode  Open file in specified mode (see std::ios_base).
832       */
833      explicit
834      basic_fstream(const std::string& __s,
835		    ios_base::openmode __mode = ios_base::in | ios_base::out)
836      : __iostream_type(0), _M_filebuf()
837      {
838	this->init(&_M_filebuf);
839	this->open(__s, __mode);
840      }
841#endif
842
843      /**
844       *  @brief  The destructor does nothing.
845       *
846       *  The file is closed by the filebuf object, not the formatting
847       *  stream.
848       */
849      ~basic_fstream()
850      { }
851
852      // Members:
853      /**
854       *  @brief  Accessing the underlying buffer.
855       *  @return  The current basic_filebuf buffer.
856       *
857       *  This hides both signatures of std::basic_ios::rdbuf().
858       */
859      __filebuf_type*
860      rdbuf() const
861      { return const_cast<__filebuf_type*>(&_M_filebuf); }
862
863      /**
864       *  @brief  Wrapper to test for an open file.
865       *  @return  @c rdbuf()->is_open()
866       */
867      bool
868      is_open()
869      { return _M_filebuf.is_open(); }
870
871      // _GLIBCXX_RESOLVE_LIB_DEFECTS
872      // 365. Lack of const-qualification in clause 27
873      bool
874      is_open() const
875      { return _M_filebuf.is_open(); }
876
877      /**
878       *  @brief  Opens an external file.
879       *  @param  __s  The name of the file.
880       *  @param  __mode  The open mode flags.
881       *
882       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
883       *  function fails, @c failbit is set in the stream's error state.
884       *
885       *  Tip:  When using std::string to hold the filename, you must use
886       *  .c_str() before passing it to this constructor.
887       */
888      void
889      open(const char* __s,
890	   ios_base::openmode __mode = ios_base::in | ios_base::out)
891      {
892	if (!_M_filebuf.open(__s, __mode))
893	  this->setstate(ios_base::failbit);
894	else
895	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
896	  // 409. Closing an fstream should clear error state
897	  this->clear();
898      }
899
900#if __cplusplus >= 201103L
901      /**
902       *  @brief  Opens an external file.
903       *  @param  __s  The name of the file.
904       *  @param  __mode  The open mode flags.
905       *
906       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
907       *  function fails, @c failbit is set in the stream's error state.
908       */
909      void
910      open(const std::string& __s,
911	   ios_base::openmode __mode = ios_base::in | ios_base::out)
912      {
913	if (!_M_filebuf.open(__s, __mode))
914	  this->setstate(ios_base::failbit);
915	else
916	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
917	  // 409. Closing an fstream should clear error state
918	  this->clear();
919      }
920#endif
921
922      /**
923       *  @brief  Close the file.
924       *
925       *  Calls @c std::basic_filebuf::close().  If that function
926       *  fails, @c failbit is set in the stream's error state.
927       */
928      void
929      close()
930      {
931	if (!_M_filebuf.close())
932	  this->setstate(ios_base::failbit);
933      }
934    };
935
936_GLIBCXX_END_NAMESPACE_VERSION
937} // namespace
938
939#include <bits/fstream.tcc>
940
941#endif /* _GLIBCXX_FSTREAM */
942