File Coverage

/usr/include/c++/5/fstream
Criterion Covered Total %
statement 1 1 100.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 1 1 100.0


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