11debfc3dSmrg// File based streams -*- C++ -*- 21debfc3dSmrg 3*8feb0f0bSmrg// Copyright (C) 1997-2020 Free Software Foundation, Inc. 41debfc3dSmrg// 51debfc3dSmrg// This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg// software; you can redistribute it and/or modify it under the 71debfc3dSmrg// terms of the GNU General Public License as published by the 81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg// any later version. 101debfc3dSmrg 111debfc3dSmrg// This library is distributed in the hope that it will be useful, 121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg// GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg// 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg// You should have received a copy of the GNU General Public License and 211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg// <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg/** @file include/fstream 261debfc3dSmrg * This is a Standard C++ Library header. 271debfc3dSmrg */ 281debfc3dSmrg 291debfc3dSmrg// 301debfc3dSmrg// ISO C++ 14882: 27.8 File-based streams 311debfc3dSmrg// 321debfc3dSmrg 331debfc3dSmrg#ifndef _GLIBCXX_FSTREAM 341debfc3dSmrg#define _GLIBCXX_FSTREAM 1 351debfc3dSmrg 361debfc3dSmrg#pragma GCC system_header 371debfc3dSmrg 381debfc3dSmrg#include <istream> 391debfc3dSmrg#include <ostream> 401debfc3dSmrg#include <bits/codecvt.h> 411debfc3dSmrg#include <cstdio> // For BUFSIZ 421debfc3dSmrg#include <bits/basic_file.h> // For __basic_file, __c_lock 431debfc3dSmrg#if __cplusplus >= 201103L 441debfc3dSmrg#include <string> // For std::string overloads. 451debfc3dSmrg#endif 461debfc3dSmrg 471debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 481debfc3dSmrg{ 491debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 501debfc3dSmrg 51a2dc1f3fSmrg#if __cplusplus >= 201703L 52a2dc1f3fSmrg // Enable if _Path is a filesystem::path or experimental::filesystem::path 53a2dc1f3fSmrg template<typename _Path, typename _Result = _Path, typename _Path2 54a2dc1f3fSmrg = decltype(std::declval<_Path&>().make_preferred().filename())> 55a2dc1f3fSmrg using _If_fs_path = enable_if_t<is_same_v<_Path, _Path2>, _Result>; 56a2dc1f3fSmrg#endif // C++17 57a2dc1f3fSmrg 58a2dc1f3fSmrg 591debfc3dSmrg // [27.8.1.1] template class basic_filebuf 601debfc3dSmrg /** 611debfc3dSmrg * @brief The actual work of input and output (for files). 621debfc3dSmrg * @ingroup io 631debfc3dSmrg * 641debfc3dSmrg * @tparam _CharT Type of character stream. 651debfc3dSmrg * @tparam _Traits Traits for character type, defaults to 661debfc3dSmrg * char_traits<_CharT>. 671debfc3dSmrg * 681debfc3dSmrg * This class associates both its input and output sequence with an 691debfc3dSmrg * external disk file, and maintains a joint file position for both 701debfc3dSmrg * sequences. Many of its semantics are described in terms of similar 711debfc3dSmrg * behavior in the Standard C Library's @c FILE streams. 721debfc3dSmrg * 731debfc3dSmrg * Requirements on traits_type, specific to this class: 741debfc3dSmrg * - traits_type::pos_type must be fpos<traits_type::state_type> 751debfc3dSmrg * - traits_type::off_type must be streamoff 761debfc3dSmrg * - traits_type::state_type must be Assignable and DefaultConstructible, 771debfc3dSmrg * - traits_type::state_type() must be the initial state for codecvt. 781debfc3dSmrg */ 791debfc3dSmrg template<typename _CharT, typename _Traits> 801debfc3dSmrg class basic_filebuf : public basic_streambuf<_CharT, _Traits> 811debfc3dSmrg { 821debfc3dSmrg#if __cplusplus >= 201103L 831debfc3dSmrg template<typename _Tp> 841debfc3dSmrg using __chk_state = __and_<is_copy_assignable<_Tp>, 851debfc3dSmrg is_copy_constructible<_Tp>, 861debfc3dSmrg is_default_constructible<_Tp>>; 871debfc3dSmrg 881debfc3dSmrg static_assert(__chk_state<typename _Traits::state_type>::value, 891debfc3dSmrg "state_type must be CopyAssignable, CopyConstructible" 901debfc3dSmrg " and DefaultConstructible"); 911debfc3dSmrg 921debfc3dSmrg static_assert(is_same<typename _Traits::pos_type, 931debfc3dSmrg fpos<typename _Traits::state_type>>::value, 941debfc3dSmrg "pos_type must be fpos<state_type>"); 951debfc3dSmrg#endif 961debfc3dSmrg public: 971debfc3dSmrg // Types: 981debfc3dSmrg typedef _CharT char_type; 991debfc3dSmrg typedef _Traits traits_type; 1001debfc3dSmrg typedef typename traits_type::int_type int_type; 1011debfc3dSmrg typedef typename traits_type::pos_type pos_type; 1021debfc3dSmrg typedef typename traits_type::off_type off_type; 1031debfc3dSmrg 1041debfc3dSmrg typedef basic_streambuf<char_type, traits_type> __streambuf_type; 1051debfc3dSmrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 1061debfc3dSmrg typedef __basic_file<char> __file_type; 1071debfc3dSmrg typedef typename traits_type::state_type __state_type; 1081debfc3dSmrg typedef codecvt<char_type, char, __state_type> __codecvt_type; 1091debfc3dSmrg 1101debfc3dSmrg friend class ios_base; // For sync_with_stdio. 1111debfc3dSmrg 1121debfc3dSmrg protected: 1131debfc3dSmrg // Data Members: 1141debfc3dSmrg // MT lock inherited from libio or other low-level io library. 1151debfc3dSmrg __c_lock _M_lock; 1161debfc3dSmrg 1171debfc3dSmrg // External buffer. 1181debfc3dSmrg __file_type _M_file; 1191debfc3dSmrg 1201debfc3dSmrg /// Place to stash in || out || in | out settings for current filebuf. 1211debfc3dSmrg ios_base::openmode _M_mode; 1221debfc3dSmrg 1231debfc3dSmrg // Beginning state type for codecvt. 1241debfc3dSmrg __state_type _M_state_beg; 1251debfc3dSmrg 1261debfc3dSmrg // During output, the state that corresponds to pptr(), 1271debfc3dSmrg // during input, the state that corresponds to egptr() and 1281debfc3dSmrg // _M_ext_next. 1291debfc3dSmrg __state_type _M_state_cur; 1301debfc3dSmrg 1311debfc3dSmrg // Not used for output. During input, the state that corresponds 1321debfc3dSmrg // to eback() and _M_ext_buf. 1331debfc3dSmrg __state_type _M_state_last; 1341debfc3dSmrg 1351debfc3dSmrg /// Pointer to the beginning of internal buffer. 1361debfc3dSmrg char_type* _M_buf; 1371debfc3dSmrg 1381debfc3dSmrg /** 1391debfc3dSmrg * Actual size of internal buffer. This number is equal to the size 1401debfc3dSmrg * of the put area + 1 position, reserved for the overflow char of 1411debfc3dSmrg * a full area. 1421debfc3dSmrg */ 1431debfc3dSmrg size_t _M_buf_size; 1441debfc3dSmrg 1451debfc3dSmrg // Set iff _M_buf is allocated memory from _M_allocate_internal_buffer. 1461debfc3dSmrg bool _M_buf_allocated; 1471debfc3dSmrg 1481debfc3dSmrg /** 1491debfc3dSmrg * _M_reading == false && _M_writing == false for @b uncommitted mode; 1501debfc3dSmrg * _M_reading == true for @b read mode; 1511debfc3dSmrg * _M_writing == true for @b write mode; 1521debfc3dSmrg * 1531debfc3dSmrg * NB: _M_reading == true && _M_writing == true is unused. 1541debfc3dSmrg */ 1551debfc3dSmrg bool _M_reading; 1561debfc3dSmrg bool _M_writing; 1571debfc3dSmrg 158*8feb0f0bSmrg ///@{ 1591debfc3dSmrg /** 1601debfc3dSmrg * Necessary bits for putback buffer management. 1611debfc3dSmrg * 1621debfc3dSmrg * @note pbacks of over one character are not currently supported. 1631debfc3dSmrg */ 1641debfc3dSmrg char_type _M_pback; 1651debfc3dSmrg char_type* _M_pback_cur_save; 1661debfc3dSmrg char_type* _M_pback_end_save; 1671debfc3dSmrg bool _M_pback_init; 168*8feb0f0bSmrg ///@} 1691debfc3dSmrg 1701debfc3dSmrg // Cached codecvt facet. 1711debfc3dSmrg const __codecvt_type* _M_codecvt; 1721debfc3dSmrg 1731debfc3dSmrg /** 1741debfc3dSmrg * Buffer for external characters. Used for input when 1751debfc3dSmrg * codecvt::always_noconv() == false. When valid, this corresponds 1761debfc3dSmrg * to eback(). 1771debfc3dSmrg */ 1781debfc3dSmrg char* _M_ext_buf; 1791debfc3dSmrg 1801debfc3dSmrg /** 1811debfc3dSmrg * Size of buffer held by _M_ext_buf. 1821debfc3dSmrg */ 1831debfc3dSmrg streamsize _M_ext_buf_size; 1841debfc3dSmrg 1851debfc3dSmrg /** 1861debfc3dSmrg * Pointers into the buffer held by _M_ext_buf that delimit a 1871debfc3dSmrg * subsequence of bytes that have been read but not yet converted. 1881debfc3dSmrg * When valid, _M_ext_next corresponds to egptr(). 1891debfc3dSmrg */ 1901debfc3dSmrg const char* _M_ext_next; 1911debfc3dSmrg char* _M_ext_end; 1921debfc3dSmrg 1931debfc3dSmrg /** 1941debfc3dSmrg * Initializes pback buffers, and moves normal buffers to safety. 1951debfc3dSmrg * Assumptions: 1961debfc3dSmrg * _M_in_cur has already been moved back 1971debfc3dSmrg */ 1981debfc3dSmrg void 1991debfc3dSmrg _M_create_pback() 2001debfc3dSmrg { 2011debfc3dSmrg if (!_M_pback_init) 2021debfc3dSmrg { 2031debfc3dSmrg _M_pback_cur_save = this->gptr(); 2041debfc3dSmrg _M_pback_end_save = this->egptr(); 2051debfc3dSmrg this->setg(&_M_pback, &_M_pback, &_M_pback + 1); 2061debfc3dSmrg _M_pback_init = true; 2071debfc3dSmrg } 2081debfc3dSmrg } 2091debfc3dSmrg 2101debfc3dSmrg /** 2111debfc3dSmrg * Deactivates pback buffer contents, and restores normal buffer. 2121debfc3dSmrg * Assumptions: 2131debfc3dSmrg * The pback buffer has only moved forward. 2141debfc3dSmrg */ 2151debfc3dSmrg void 2161debfc3dSmrg _M_destroy_pback() throw() 2171debfc3dSmrg { 2181debfc3dSmrg if (_M_pback_init) 2191debfc3dSmrg { 2201debfc3dSmrg // Length _M_in_cur moved in the pback buffer. 2211debfc3dSmrg _M_pback_cur_save += this->gptr() != this->eback(); 2221debfc3dSmrg this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save); 2231debfc3dSmrg _M_pback_init = false; 2241debfc3dSmrg } 2251debfc3dSmrg } 2261debfc3dSmrg 2271debfc3dSmrg public: 2281debfc3dSmrg // Constructors/destructor: 2291debfc3dSmrg /** 2301debfc3dSmrg * @brief Does not open any files. 2311debfc3dSmrg * 2321debfc3dSmrg * The default constructor initializes the parent class using its 2331debfc3dSmrg * own default ctor. 2341debfc3dSmrg */ 2351debfc3dSmrg basic_filebuf(); 2361debfc3dSmrg 2371debfc3dSmrg#if __cplusplus >= 201103L 2381debfc3dSmrg basic_filebuf(const basic_filebuf&) = delete; 2391debfc3dSmrg basic_filebuf(basic_filebuf&&); 2401debfc3dSmrg#endif 2411debfc3dSmrg 2421debfc3dSmrg /** 2431debfc3dSmrg * @brief The destructor closes the file first. 2441debfc3dSmrg */ 2451debfc3dSmrg virtual 2461debfc3dSmrg ~basic_filebuf() 247c0a68be4Smrg { 248c0a68be4Smrg __try 2491debfc3dSmrg { this->close(); } 250c0a68be4Smrg __catch(...) 251c0a68be4Smrg { } 252c0a68be4Smrg } 2531debfc3dSmrg 2541debfc3dSmrg#if __cplusplus >= 201103L 2551debfc3dSmrg basic_filebuf& operator=(const basic_filebuf&) = delete; 2561debfc3dSmrg basic_filebuf& operator=(basic_filebuf&&); 2571debfc3dSmrg void swap(basic_filebuf&); 2581debfc3dSmrg#endif 2591debfc3dSmrg 2601debfc3dSmrg // Members: 2611debfc3dSmrg /** 2621debfc3dSmrg * @brief Returns true if the external file is open. 2631debfc3dSmrg */ 2641debfc3dSmrg bool 2651debfc3dSmrg is_open() const throw() 2661debfc3dSmrg { return _M_file.is_open(); } 2671debfc3dSmrg 2681debfc3dSmrg /** 2691debfc3dSmrg * @brief Opens an external file. 2701debfc3dSmrg * @param __s The name of the file. 2711debfc3dSmrg * @param __mode The open mode flags. 2721debfc3dSmrg * @return @c this on success, NULL on failure 2731debfc3dSmrg * 2741debfc3dSmrg * If a file is already open, this function immediately fails. 2751debfc3dSmrg * Otherwise it tries to open the file named @a __s using the flags 2761debfc3dSmrg * given in @a __mode. 2771debfc3dSmrg * 2781debfc3dSmrg * Table 92, adapted here, gives the relation between openmode 2791debfc3dSmrg * combinations and the equivalent @c fopen() flags. 2801debfc3dSmrg * (NB: lines app, in|out|app, in|app, binary|app, binary|in|out|app, 2811debfc3dSmrg * and binary|in|app per DR 596) 2821debfc3dSmrg * <pre> 2831debfc3dSmrg * +---------------------------------------------------------+ 2841debfc3dSmrg * | ios_base Flag combination stdio equivalent | 2851debfc3dSmrg * |binary in out trunc app | 2861debfc3dSmrg * +---------------------------------------------------------+ 2871debfc3dSmrg * | + w | 2881debfc3dSmrg * | + + a | 2891debfc3dSmrg * | + a | 2901debfc3dSmrg * | + + w | 2911debfc3dSmrg * | + r | 2921debfc3dSmrg * | + + r+ | 2931debfc3dSmrg * | + + + w+ | 2941debfc3dSmrg * | + + + a+ | 2951debfc3dSmrg * | + + a+ | 2961debfc3dSmrg * +---------------------------------------------------------+ 2971debfc3dSmrg * | + + wb | 2981debfc3dSmrg * | + + + ab | 2991debfc3dSmrg * | + + ab | 3001debfc3dSmrg * | + + + wb | 3011debfc3dSmrg * | + + rb | 3021debfc3dSmrg * | + + + r+b | 3031debfc3dSmrg * | + + + + w+b | 3041debfc3dSmrg * | + + + + a+b | 3051debfc3dSmrg * | + + + a+b | 3061debfc3dSmrg * +---------------------------------------------------------+ 3071debfc3dSmrg * </pre> 3081debfc3dSmrg */ 3091debfc3dSmrg __filebuf_type* 3101debfc3dSmrg open(const char* __s, ios_base::openmode __mode); 3111debfc3dSmrg 312c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 313c0a68be4Smrg /** 314c0a68be4Smrg * @brief Opens an external file. 315c0a68be4Smrg * @param __s The name of the file, as a wide character string. 316c0a68be4Smrg * @param __mode The open mode flags. 317c0a68be4Smrg * @return @c this on success, NULL on failure 318c0a68be4Smrg */ 319c0a68be4Smrg __filebuf_type* 320c0a68be4Smrg open(const wchar_t* __s, ios_base::openmode __mode); 321c0a68be4Smrg#endif 322c0a68be4Smrg 3231debfc3dSmrg#if __cplusplus >= 201103L 3241debfc3dSmrg /** 3251debfc3dSmrg * @brief Opens an external file. 3261debfc3dSmrg * @param __s The name of the file. 3271debfc3dSmrg * @param __mode The open mode flags. 3281debfc3dSmrg * @return @c this on success, NULL on failure 3291debfc3dSmrg */ 3301debfc3dSmrg __filebuf_type* 3311debfc3dSmrg open(const std::string& __s, ios_base::openmode __mode) 3321debfc3dSmrg { return open(__s.c_str(), __mode); } 333a2dc1f3fSmrg 334a2dc1f3fSmrg#if __cplusplus >= 201703L 335a2dc1f3fSmrg /** 336a2dc1f3fSmrg * @brief Opens an external file. 337a2dc1f3fSmrg * @param __s The name of the file, as a filesystem::path. 338a2dc1f3fSmrg * @param __mode The open mode flags. 339a2dc1f3fSmrg * @return @c this on success, NULL on failure 340a2dc1f3fSmrg */ 341a2dc1f3fSmrg template<typename _Path> 342a2dc1f3fSmrg _If_fs_path<_Path, __filebuf_type*> 343a2dc1f3fSmrg open(const _Path& __s, ios_base::openmode __mode) 344a2dc1f3fSmrg { return open(__s.c_str(), __mode); } 345a2dc1f3fSmrg#endif // C++17 346a2dc1f3fSmrg#endif // C++11 3471debfc3dSmrg 3481debfc3dSmrg /** 3491debfc3dSmrg * @brief Closes the currently associated file. 3501debfc3dSmrg * @return @c this on success, NULL on failure 3511debfc3dSmrg * 3521debfc3dSmrg * If no file is currently open, this function immediately fails. 3531debfc3dSmrg * 3541debfc3dSmrg * If a <em>put buffer area</em> exists, @c overflow(eof) is 3551debfc3dSmrg * called to flush all the characters. The file is then 3561debfc3dSmrg * closed. 3571debfc3dSmrg * 3581debfc3dSmrg * If any operations fail, this function also fails. 3591debfc3dSmrg */ 3601debfc3dSmrg __filebuf_type* 3611debfc3dSmrg close(); 3621debfc3dSmrg 3631debfc3dSmrg protected: 3641debfc3dSmrg void 3651debfc3dSmrg _M_allocate_internal_buffer(); 3661debfc3dSmrg 3671debfc3dSmrg void 3681debfc3dSmrg _M_destroy_internal_buffer() throw(); 3691debfc3dSmrg 3701debfc3dSmrg // [27.8.1.4] overridden virtual functions 3711debfc3dSmrg virtual streamsize 3721debfc3dSmrg showmanyc(); 3731debfc3dSmrg 3741debfc3dSmrg // Stroustrup, 1998, p. 628 3751debfc3dSmrg // underflow() and uflow() functions are called to get the next 3761debfc3dSmrg // character from the real input source when the buffer is empty. 3771debfc3dSmrg // Buffered input uses underflow() 3781debfc3dSmrg 3791debfc3dSmrg virtual int_type 3801debfc3dSmrg underflow(); 3811debfc3dSmrg 3821debfc3dSmrg virtual int_type 3831debfc3dSmrg pbackfail(int_type __c = _Traits::eof()); 3841debfc3dSmrg 3851debfc3dSmrg // Stroustrup, 1998, p 648 3861debfc3dSmrg // The overflow() function is called to transfer characters to the 3871debfc3dSmrg // real output destination when the buffer is full. A call to 3881debfc3dSmrg // overflow(c) outputs the contents of the buffer plus the 3891debfc3dSmrg // character c. 3901debfc3dSmrg // 27.5.2.4.5 3911debfc3dSmrg // Consume some sequence of the characters in the pending sequence. 3921debfc3dSmrg virtual int_type 3931debfc3dSmrg overflow(int_type __c = _Traits::eof()); 3941debfc3dSmrg 3951debfc3dSmrg // Convert internal byte sequence to external, char-based 3961debfc3dSmrg // sequence via codecvt. 3971debfc3dSmrg bool 3981debfc3dSmrg _M_convert_to_external(char_type*, streamsize); 3991debfc3dSmrg 4001debfc3dSmrg /** 4011debfc3dSmrg * @brief Manipulates the buffer. 4021debfc3dSmrg * @param __s Pointer to a buffer area. 4031debfc3dSmrg * @param __n Size of @a __s. 4041debfc3dSmrg * @return @c this 4051debfc3dSmrg * 4061debfc3dSmrg * If no file has been opened, and both @a __s and @a __n are zero, then 4071debfc3dSmrg * the stream becomes unbuffered. Otherwise, @c __s is used as a 4081debfc3dSmrg * buffer; see 4091debfc3dSmrg * https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering 4101debfc3dSmrg * for more. 4111debfc3dSmrg */ 4121debfc3dSmrg virtual __streambuf_type* 4131debfc3dSmrg setbuf(char_type* __s, streamsize __n); 4141debfc3dSmrg 4151debfc3dSmrg virtual pos_type 4161debfc3dSmrg seekoff(off_type __off, ios_base::seekdir __way, 4171debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out); 4181debfc3dSmrg 4191debfc3dSmrg virtual pos_type 4201debfc3dSmrg seekpos(pos_type __pos, 4211debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out); 4221debfc3dSmrg 4231debfc3dSmrg // Common code for seekoff, seekpos, and overflow 4241debfc3dSmrg pos_type 4251debfc3dSmrg _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state); 4261debfc3dSmrg 4271debfc3dSmrg int 4281debfc3dSmrg _M_get_ext_pos(__state_type &__state); 4291debfc3dSmrg 4301debfc3dSmrg virtual int 4311debfc3dSmrg sync(); 4321debfc3dSmrg 4331debfc3dSmrg virtual void 4341debfc3dSmrg imbue(const locale& __loc); 4351debfc3dSmrg 4361debfc3dSmrg virtual streamsize 4371debfc3dSmrg xsgetn(char_type* __s, streamsize __n); 4381debfc3dSmrg 4391debfc3dSmrg virtual streamsize 4401debfc3dSmrg xsputn(const char_type* __s, streamsize __n); 4411debfc3dSmrg 4421debfc3dSmrg // Flushes output buffer, then writes unshift sequence. 4431debfc3dSmrg bool 4441debfc3dSmrg _M_terminate_output(); 4451debfc3dSmrg 4461debfc3dSmrg /** 4471debfc3dSmrg * This function sets the pointers of the internal buffer, both get 4481debfc3dSmrg * and put areas. Typically: 4491debfc3dSmrg * 4501debfc3dSmrg * __off == egptr() - eback() upon underflow/uflow (@b read mode); 4511debfc3dSmrg * __off == 0 upon overflow (@b write mode); 4521debfc3dSmrg * __off == -1 upon open, setbuf, seekoff/pos (@b uncommitted mode). 4531debfc3dSmrg * 4541debfc3dSmrg * NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size 4551debfc3dSmrg * reflects the actual allocated memory and the last cell is reserved 4561debfc3dSmrg * for the overflow char of a full put area. 4571debfc3dSmrg */ 4581debfc3dSmrg void 4591debfc3dSmrg _M_set_buffer(streamsize __off) 4601debfc3dSmrg { 4611debfc3dSmrg const bool __testin = _M_mode & ios_base::in; 4621debfc3dSmrg const bool __testout = (_M_mode & ios_base::out 4631debfc3dSmrg || _M_mode & ios_base::app); 4641debfc3dSmrg 4651debfc3dSmrg if (__testin && __off > 0) 4661debfc3dSmrg this->setg(_M_buf, _M_buf, _M_buf + __off); 4671debfc3dSmrg else 4681debfc3dSmrg this->setg(_M_buf, _M_buf, _M_buf); 4691debfc3dSmrg 4701debfc3dSmrg if (__testout && __off == 0 && _M_buf_size > 1 ) 4711debfc3dSmrg this->setp(_M_buf, _M_buf + _M_buf_size - 1); 4721debfc3dSmrg else 4731debfc3dSmrg this->setp(0, 0); 4741debfc3dSmrg } 4751debfc3dSmrg }; 4761debfc3dSmrg 4771debfc3dSmrg // [27.8.1.5] Template class basic_ifstream 4781debfc3dSmrg /** 4791debfc3dSmrg * @brief Controlling input for files. 4801debfc3dSmrg * @ingroup io 4811debfc3dSmrg * 4821debfc3dSmrg * @tparam _CharT Type of character stream. 4831debfc3dSmrg * @tparam _Traits Traits for character type, defaults to 4841debfc3dSmrg * char_traits<_CharT>. 4851debfc3dSmrg * 4861debfc3dSmrg * This class supports reading from named files, using the inherited 4871debfc3dSmrg * functions from std::basic_istream. To control the associated 4881debfc3dSmrg * sequence, an instance of std::basic_filebuf is used, which this page 4891debfc3dSmrg * refers to as @c sb. 4901debfc3dSmrg */ 4911debfc3dSmrg template<typename _CharT, typename _Traits> 4921debfc3dSmrg class basic_ifstream : public basic_istream<_CharT, _Traits> 4931debfc3dSmrg { 4941debfc3dSmrg public: 4951debfc3dSmrg // Types: 4961debfc3dSmrg typedef _CharT char_type; 4971debfc3dSmrg typedef _Traits traits_type; 4981debfc3dSmrg typedef typename traits_type::int_type int_type; 4991debfc3dSmrg typedef typename traits_type::pos_type pos_type; 5001debfc3dSmrg typedef typename traits_type::off_type off_type; 5011debfc3dSmrg 5021debfc3dSmrg // Non-standard types: 5031debfc3dSmrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 5041debfc3dSmrg typedef basic_istream<char_type, traits_type> __istream_type; 5051debfc3dSmrg 5061debfc3dSmrg private: 5071debfc3dSmrg __filebuf_type _M_filebuf; 5081debfc3dSmrg 5091debfc3dSmrg public: 5101debfc3dSmrg // Constructors/Destructors: 5111debfc3dSmrg /** 5121debfc3dSmrg * @brief Default constructor. 5131debfc3dSmrg * 5141debfc3dSmrg * Initializes @c sb using its default constructor, and passes 5151debfc3dSmrg * @c &sb to the base class initializer. Does not open any files 5161debfc3dSmrg * (you haven't given it a filename to open). 5171debfc3dSmrg */ 5181debfc3dSmrg basic_ifstream() : __istream_type(), _M_filebuf() 5191debfc3dSmrg { this->init(&_M_filebuf); } 5201debfc3dSmrg 5211debfc3dSmrg /** 5221debfc3dSmrg * @brief Create an input file stream. 5231debfc3dSmrg * @param __s Null terminated string specifying the filename. 5241debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 5251debfc3dSmrg * 5261debfc3dSmrg * @c ios_base::in is automatically included in @a __mode. 5271debfc3dSmrg */ 5281debfc3dSmrg explicit 5291debfc3dSmrg basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in) 5301debfc3dSmrg : __istream_type(), _M_filebuf() 5311debfc3dSmrg { 5321debfc3dSmrg this->init(&_M_filebuf); 5331debfc3dSmrg this->open(__s, __mode); 5341debfc3dSmrg } 5351debfc3dSmrg 536c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 537c0a68be4Smrg /** 538c0a68be4Smrg * @param Create an input file stream. 539c0a68be4Smrg * @param __s Wide string specifying the filename. 540c0a68be4Smrg * @param __mode Open file in specified mode (see std::ios_base). 541c0a68be4Smrg * 542c0a68be4Smrg * @c ios_base::in is automatically included in @a __mode. 543c0a68be4Smrg */ 544c0a68be4Smrg basic_ifstream(const wchar_t* __s, 545c0a68be4Smrg ios_base::openmode __mode = ios_base::in) 546c0a68be4Smrg : __istream_type(), _M_filebuf() 547c0a68be4Smrg { 548c0a68be4Smrg this->init(&_M_filebuf); 549c0a68be4Smrg this->open(__s, __mode); 550c0a68be4Smrg } 551c0a68be4Smrg#endif 552c0a68be4Smrg 5531debfc3dSmrg#if __cplusplus >= 201103L 5541debfc3dSmrg /** 5551debfc3dSmrg * @brief Create an input file stream. 5561debfc3dSmrg * @param __s std::string specifying the filename. 5571debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 5581debfc3dSmrg * 5591debfc3dSmrg * @c ios_base::in is automatically included in @a __mode. 5601debfc3dSmrg */ 5611debfc3dSmrg explicit 5621debfc3dSmrg basic_ifstream(const std::string& __s, 5631debfc3dSmrg ios_base::openmode __mode = ios_base::in) 5641debfc3dSmrg : __istream_type(), _M_filebuf() 5651debfc3dSmrg { 5661debfc3dSmrg this->init(&_M_filebuf); 5671debfc3dSmrg this->open(__s, __mode); 5681debfc3dSmrg } 5691debfc3dSmrg 570a2dc1f3fSmrg#if __cplusplus >= 201703L 571a2dc1f3fSmrg /** 572*8feb0f0bSmrg * @brief Create an input file stream. 573a2dc1f3fSmrg * @param __s filesystem::path specifying the filename. 574a2dc1f3fSmrg * @param __mode Open file in specified mode (see std::ios_base). 575a2dc1f3fSmrg * 576a2dc1f3fSmrg * @c ios_base::in is automatically included in @a __mode. 577a2dc1f3fSmrg */ 578a2dc1f3fSmrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 579a2dc1f3fSmrg basic_ifstream(const _Path& __s, 580a2dc1f3fSmrg ios_base::openmode __mode = ios_base::in) 581a2dc1f3fSmrg : basic_ifstream(__s.c_str(), __mode) 582a2dc1f3fSmrg { } 583a2dc1f3fSmrg#endif // C++17 584a2dc1f3fSmrg 5851debfc3dSmrg basic_ifstream(const basic_ifstream&) = delete; 5861debfc3dSmrg 5871debfc3dSmrg basic_ifstream(basic_ifstream&& __rhs) 5881debfc3dSmrg : __istream_type(std::move(__rhs)), 5891debfc3dSmrg _M_filebuf(std::move(__rhs._M_filebuf)) 5901debfc3dSmrg { __istream_type::set_rdbuf(&_M_filebuf); } 591a2dc1f3fSmrg#endif // C++11 5921debfc3dSmrg 5931debfc3dSmrg /** 5941debfc3dSmrg * @brief The destructor does nothing. 5951debfc3dSmrg * 5961debfc3dSmrg * The file is closed by the filebuf object, not the formatting 5971debfc3dSmrg * stream. 5981debfc3dSmrg */ 5991debfc3dSmrg ~basic_ifstream() 6001debfc3dSmrg { } 6011debfc3dSmrg 6021debfc3dSmrg#if __cplusplus >= 201103L 6031debfc3dSmrg // 27.8.3.2 Assign and swap: 6041debfc3dSmrg 6051debfc3dSmrg basic_ifstream& 6061debfc3dSmrg operator=(const basic_ifstream&) = delete; 6071debfc3dSmrg 6081debfc3dSmrg basic_ifstream& 6091debfc3dSmrg operator=(basic_ifstream&& __rhs) 6101debfc3dSmrg { 6111debfc3dSmrg __istream_type::operator=(std::move(__rhs)); 6121debfc3dSmrg _M_filebuf = std::move(__rhs._M_filebuf); 6131debfc3dSmrg return *this; 6141debfc3dSmrg } 6151debfc3dSmrg 6161debfc3dSmrg void 6171debfc3dSmrg swap(basic_ifstream& __rhs) 6181debfc3dSmrg { 6191debfc3dSmrg __istream_type::swap(__rhs); 6201debfc3dSmrg _M_filebuf.swap(__rhs._M_filebuf); 6211debfc3dSmrg } 6221debfc3dSmrg#endif 6231debfc3dSmrg 6241debfc3dSmrg // Members: 6251debfc3dSmrg /** 6261debfc3dSmrg * @brief Accessing the underlying buffer. 6271debfc3dSmrg * @return The current basic_filebuf buffer. 6281debfc3dSmrg * 6291debfc3dSmrg * This hides both signatures of std::basic_ios::rdbuf(). 6301debfc3dSmrg */ 6311debfc3dSmrg __filebuf_type* 6321debfc3dSmrg rdbuf() const 6331debfc3dSmrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 6341debfc3dSmrg 6351debfc3dSmrg /** 6361debfc3dSmrg * @brief Wrapper to test for an open file. 6371debfc3dSmrg * @return @c rdbuf()->is_open() 6381debfc3dSmrg */ 6391debfc3dSmrg bool 6401debfc3dSmrg is_open() 6411debfc3dSmrg { return _M_filebuf.is_open(); } 6421debfc3dSmrg 6431debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 6441debfc3dSmrg // 365. Lack of const-qualification in clause 27 6451debfc3dSmrg bool 6461debfc3dSmrg is_open() const 6471debfc3dSmrg { return _M_filebuf.is_open(); } 6481debfc3dSmrg 6491debfc3dSmrg /** 6501debfc3dSmrg * @brief Opens an external file. 6511debfc3dSmrg * @param __s The name of the file. 6521debfc3dSmrg * @param __mode The open mode flags. 6531debfc3dSmrg * 6541debfc3dSmrg * Calls @c std::basic_filebuf::open(s,__mode|in). If that function 6551debfc3dSmrg * fails, @c failbit is set in the stream's error state. 6561debfc3dSmrg */ 6571debfc3dSmrg void 6581debfc3dSmrg open(const char* __s, ios_base::openmode __mode = ios_base::in) 6591debfc3dSmrg { 6601debfc3dSmrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 6611debfc3dSmrg this->setstate(ios_base::failbit); 6621debfc3dSmrg else 6631debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 6641debfc3dSmrg // 409. Closing an fstream should clear error state 6651debfc3dSmrg this->clear(); 6661debfc3dSmrg } 6671debfc3dSmrg 668c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 669c0a68be4Smrg /** 670c0a68be4Smrg * @brief Opens an external file. 671c0a68be4Smrg * @param __s The name of the file, as a wide character string. 672c0a68be4Smrg * @param __mode The open mode flags. 673c0a68be4Smrg * 674c0a68be4Smrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 675c0a68be4Smrg * fails, @c failbit is set in the stream's error state. 676c0a68be4Smrg */ 677c0a68be4Smrg void 678c0a68be4Smrg open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in) 679c0a68be4Smrg { 680c0a68be4Smrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 681c0a68be4Smrg this->setstate(ios_base::failbit); 682c0a68be4Smrg else 683c0a68be4Smrg this->clear(); 684c0a68be4Smrg } 685c0a68be4Smrg#endif 686c0a68be4Smrg 6871debfc3dSmrg#if __cplusplus >= 201103L 6881debfc3dSmrg /** 6891debfc3dSmrg * @brief Opens an external file. 6901debfc3dSmrg * @param __s The name of the file. 6911debfc3dSmrg * @param __mode The open mode flags. 6921debfc3dSmrg * 6931debfc3dSmrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 6941debfc3dSmrg * fails, @c failbit is set in the stream's error state. 6951debfc3dSmrg */ 6961debfc3dSmrg void 6971debfc3dSmrg open(const std::string& __s, ios_base::openmode __mode = ios_base::in) 6981debfc3dSmrg { 6991debfc3dSmrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 7001debfc3dSmrg this->setstate(ios_base::failbit); 7011debfc3dSmrg else 7021debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 7031debfc3dSmrg // 409. Closing an fstream should clear error state 7041debfc3dSmrg this->clear(); 7051debfc3dSmrg } 706a2dc1f3fSmrg 707a2dc1f3fSmrg#if __cplusplus >= 201703L 708a2dc1f3fSmrg /** 709a2dc1f3fSmrg * @brief Opens an external file. 710a2dc1f3fSmrg * @param __s The name of the file, as a filesystem::path. 711a2dc1f3fSmrg * @param __mode The open mode flags. 712a2dc1f3fSmrg * 713a2dc1f3fSmrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 714a2dc1f3fSmrg * fails, @c failbit is set in the stream's error state. 715a2dc1f3fSmrg */ 716a2dc1f3fSmrg template<typename _Path> 717a2dc1f3fSmrg _If_fs_path<_Path, void> 718a2dc1f3fSmrg open(const _Path& __s, ios_base::openmode __mode = ios_base::in) 719a2dc1f3fSmrg { open(__s.c_str(), __mode); } 720a2dc1f3fSmrg#endif // C++17 721a2dc1f3fSmrg#endif // C++11 7221debfc3dSmrg 7231debfc3dSmrg /** 7241debfc3dSmrg * @brief Close the file. 7251debfc3dSmrg * 7261debfc3dSmrg * Calls @c std::basic_filebuf::close(). If that function 7271debfc3dSmrg * fails, @c failbit is set in the stream's error state. 7281debfc3dSmrg */ 7291debfc3dSmrg void 7301debfc3dSmrg close() 7311debfc3dSmrg { 7321debfc3dSmrg if (!_M_filebuf.close()) 7331debfc3dSmrg this->setstate(ios_base::failbit); 7341debfc3dSmrg } 7351debfc3dSmrg }; 7361debfc3dSmrg 7371debfc3dSmrg 7381debfc3dSmrg // [27.8.1.8] Template class basic_ofstream 7391debfc3dSmrg /** 7401debfc3dSmrg * @brief Controlling output for files. 7411debfc3dSmrg * @ingroup io 7421debfc3dSmrg * 7431debfc3dSmrg * @tparam _CharT Type of character stream. 7441debfc3dSmrg * @tparam _Traits Traits for character type, defaults to 7451debfc3dSmrg * char_traits<_CharT>. 7461debfc3dSmrg * 7471debfc3dSmrg * This class supports reading from named files, using the inherited 7481debfc3dSmrg * functions from std::basic_ostream. To control the associated 7491debfc3dSmrg * sequence, an instance of std::basic_filebuf is used, which this page 7501debfc3dSmrg * refers to as @c sb. 7511debfc3dSmrg */ 7521debfc3dSmrg template<typename _CharT, typename _Traits> 7531debfc3dSmrg class basic_ofstream : public basic_ostream<_CharT,_Traits> 7541debfc3dSmrg { 7551debfc3dSmrg public: 7561debfc3dSmrg // Types: 7571debfc3dSmrg typedef _CharT char_type; 7581debfc3dSmrg typedef _Traits traits_type; 7591debfc3dSmrg typedef typename traits_type::int_type int_type; 7601debfc3dSmrg typedef typename traits_type::pos_type pos_type; 7611debfc3dSmrg typedef typename traits_type::off_type off_type; 7621debfc3dSmrg 7631debfc3dSmrg // Non-standard types: 7641debfc3dSmrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 7651debfc3dSmrg typedef basic_ostream<char_type, traits_type> __ostream_type; 7661debfc3dSmrg 7671debfc3dSmrg private: 7681debfc3dSmrg __filebuf_type _M_filebuf; 7691debfc3dSmrg 7701debfc3dSmrg public: 7711debfc3dSmrg // Constructors: 7721debfc3dSmrg /** 7731debfc3dSmrg * @brief Default constructor. 7741debfc3dSmrg * 7751debfc3dSmrg * Initializes @c sb using its default constructor, and passes 7761debfc3dSmrg * @c &sb to the base class initializer. Does not open any files 7771debfc3dSmrg * (you haven't given it a filename to open). 7781debfc3dSmrg */ 7791debfc3dSmrg basic_ofstream(): __ostream_type(), _M_filebuf() 7801debfc3dSmrg { this->init(&_M_filebuf); } 7811debfc3dSmrg 7821debfc3dSmrg /** 7831debfc3dSmrg * @brief Create an output file stream. 7841debfc3dSmrg * @param __s Null terminated string specifying the filename. 7851debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 7861debfc3dSmrg * 787a2dc1f3fSmrg * @c ios_base::out is automatically included in @a __mode. 7881debfc3dSmrg */ 7891debfc3dSmrg explicit 7901debfc3dSmrg basic_ofstream(const char* __s, 791a2dc1f3fSmrg ios_base::openmode __mode = ios_base::out) 7921debfc3dSmrg : __ostream_type(), _M_filebuf() 7931debfc3dSmrg { 7941debfc3dSmrg this->init(&_M_filebuf); 7951debfc3dSmrg this->open(__s, __mode); 7961debfc3dSmrg } 7971debfc3dSmrg 798c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 799c0a68be4Smrg /** 800c0a68be4Smrg * @param Create an output file stream. 801c0a68be4Smrg * @param __s Wide string specifying the filename. 802c0a68be4Smrg * @param __mode Open file in specified mode (see std::ios_base). 803c0a68be4Smrg * 804c0a68be4Smrg * @c ios_base::out | @c ios_base::trunc is automatically included in 805c0a68be4Smrg * @a __mode. 806c0a68be4Smrg */ 807c0a68be4Smrg basic_ofstream(const wchar_t* __s, 808c0a68be4Smrg ios_base::openmode __mode = ios_base::out|ios_base::trunc) 809c0a68be4Smrg : __ostream_type(), _M_filebuf() 810c0a68be4Smrg { 811c0a68be4Smrg this->init(&_M_filebuf); 812c0a68be4Smrg this->open(__s, __mode); 813c0a68be4Smrg } 814c0a68be4Smrg#endif 815c0a68be4Smrg 8161debfc3dSmrg#if __cplusplus >= 201103L 8171debfc3dSmrg /** 8181debfc3dSmrg * @brief Create an output file stream. 8191debfc3dSmrg * @param __s std::string specifying the filename. 8201debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 8211debfc3dSmrg * 822a2dc1f3fSmrg * @c ios_base::out is automatically included in @a __mode. 8231debfc3dSmrg */ 8241debfc3dSmrg explicit 8251debfc3dSmrg basic_ofstream(const std::string& __s, 826a2dc1f3fSmrg ios_base::openmode __mode = ios_base::out) 8271debfc3dSmrg : __ostream_type(), _M_filebuf() 8281debfc3dSmrg { 8291debfc3dSmrg this->init(&_M_filebuf); 8301debfc3dSmrg this->open(__s, __mode); 8311debfc3dSmrg } 8321debfc3dSmrg 833a2dc1f3fSmrg#if __cplusplus >= 201703L 834a2dc1f3fSmrg /** 835*8feb0f0bSmrg * @brief Create an output file stream. 836a2dc1f3fSmrg * @param __s filesystem::path specifying the filename. 837a2dc1f3fSmrg * @param __mode Open file in specified mode (see std::ios_base). 838a2dc1f3fSmrg * 839a2dc1f3fSmrg * @c ios_base::out is automatically included in @a __mode. 840a2dc1f3fSmrg */ 841a2dc1f3fSmrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 842a2dc1f3fSmrg basic_ofstream(const _Path& __s, 843a2dc1f3fSmrg ios_base::openmode __mode = ios_base::out) 844a2dc1f3fSmrg : basic_ofstream(__s.c_str(), __mode) 845a2dc1f3fSmrg { } 846a2dc1f3fSmrg#endif // C++17 847a2dc1f3fSmrg 8481debfc3dSmrg basic_ofstream(const basic_ofstream&) = delete; 8491debfc3dSmrg 8501debfc3dSmrg basic_ofstream(basic_ofstream&& __rhs) 8511debfc3dSmrg : __ostream_type(std::move(__rhs)), 8521debfc3dSmrg _M_filebuf(std::move(__rhs._M_filebuf)) 8531debfc3dSmrg { __ostream_type::set_rdbuf(&_M_filebuf); } 8541debfc3dSmrg#endif 8551debfc3dSmrg 8561debfc3dSmrg /** 8571debfc3dSmrg * @brief The destructor does nothing. 8581debfc3dSmrg * 8591debfc3dSmrg * The file is closed by the filebuf object, not the formatting 8601debfc3dSmrg * stream. 8611debfc3dSmrg */ 8621debfc3dSmrg ~basic_ofstream() 8631debfc3dSmrg { } 8641debfc3dSmrg 8651debfc3dSmrg#if __cplusplus >= 201103L 8661debfc3dSmrg // 27.8.3.2 Assign and swap: 8671debfc3dSmrg 8681debfc3dSmrg basic_ofstream& 8691debfc3dSmrg operator=(const basic_ofstream&) = delete; 8701debfc3dSmrg 8711debfc3dSmrg basic_ofstream& 8721debfc3dSmrg operator=(basic_ofstream&& __rhs) 8731debfc3dSmrg { 8741debfc3dSmrg __ostream_type::operator=(std::move(__rhs)); 8751debfc3dSmrg _M_filebuf = std::move(__rhs._M_filebuf); 8761debfc3dSmrg return *this; 8771debfc3dSmrg } 8781debfc3dSmrg 8791debfc3dSmrg void 8801debfc3dSmrg swap(basic_ofstream& __rhs) 8811debfc3dSmrg { 8821debfc3dSmrg __ostream_type::swap(__rhs); 8831debfc3dSmrg _M_filebuf.swap(__rhs._M_filebuf); 8841debfc3dSmrg } 8851debfc3dSmrg#endif 8861debfc3dSmrg 8871debfc3dSmrg // Members: 8881debfc3dSmrg /** 8891debfc3dSmrg * @brief Accessing the underlying buffer. 8901debfc3dSmrg * @return The current basic_filebuf buffer. 8911debfc3dSmrg * 8921debfc3dSmrg * This hides both signatures of std::basic_ios::rdbuf(). 8931debfc3dSmrg */ 8941debfc3dSmrg __filebuf_type* 8951debfc3dSmrg rdbuf() const 8961debfc3dSmrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 8971debfc3dSmrg 8981debfc3dSmrg /** 8991debfc3dSmrg * @brief Wrapper to test for an open file. 9001debfc3dSmrg * @return @c rdbuf()->is_open() 9011debfc3dSmrg */ 9021debfc3dSmrg bool 9031debfc3dSmrg is_open() 9041debfc3dSmrg { return _M_filebuf.is_open(); } 9051debfc3dSmrg 9061debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9071debfc3dSmrg // 365. Lack of const-qualification in clause 27 9081debfc3dSmrg bool 9091debfc3dSmrg is_open() const 9101debfc3dSmrg { return _M_filebuf.is_open(); } 9111debfc3dSmrg 9121debfc3dSmrg /** 9131debfc3dSmrg * @brief Opens an external file. 9141debfc3dSmrg * @param __s The name of the file. 9151debfc3dSmrg * @param __mode The open mode flags. 9161debfc3dSmrg * 917a2dc1f3fSmrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 9181debfc3dSmrg * function fails, @c failbit is set in the stream's error state. 9191debfc3dSmrg */ 9201debfc3dSmrg void 921a2dc1f3fSmrg open(const char* __s, ios_base::openmode __mode = ios_base::out) 9221debfc3dSmrg { 9231debfc3dSmrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 9241debfc3dSmrg this->setstate(ios_base::failbit); 9251debfc3dSmrg else 9261debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9271debfc3dSmrg // 409. Closing an fstream should clear error state 9281debfc3dSmrg this->clear(); 9291debfc3dSmrg } 9301debfc3dSmrg 931c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 932c0a68be4Smrg /** 933c0a68be4Smrg * @brief Opens an external file. 934c0a68be4Smrg * @param __s The name of the file. 935c0a68be4Smrg * @param __mode The open mode flags. 936c0a68be4Smrg * 937c0a68be4Smrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 938c0a68be4Smrg * function fails, @c failbit is set in the stream's error state. 939c0a68be4Smrg */ 940c0a68be4Smrg void 941c0a68be4Smrg open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out) 942c0a68be4Smrg { 943c0a68be4Smrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 944c0a68be4Smrg this->setstate(ios_base::failbit); 945c0a68be4Smrg else 946c0a68be4Smrg this->clear(); 947c0a68be4Smrg } 948c0a68be4Smrg#endif 949c0a68be4Smrg 9501debfc3dSmrg#if __cplusplus >= 201103L 9511debfc3dSmrg /** 9521debfc3dSmrg * @brief Opens an external file. 9531debfc3dSmrg * @param __s The name of the file. 9541debfc3dSmrg * @param __mode The open mode flags. 9551debfc3dSmrg * 956a2dc1f3fSmrg * Calls @c std::basic_filebuf::open(s,mode|out). If that 9571debfc3dSmrg * function fails, @c failbit is set in the stream's error state. 9581debfc3dSmrg */ 9591debfc3dSmrg void 960a2dc1f3fSmrg open(const std::string& __s, ios_base::openmode __mode = ios_base::out) 9611debfc3dSmrg { 9621debfc3dSmrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 9631debfc3dSmrg this->setstate(ios_base::failbit); 9641debfc3dSmrg else 9651debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9661debfc3dSmrg // 409. Closing an fstream should clear error state 9671debfc3dSmrg this->clear(); 9681debfc3dSmrg } 969a2dc1f3fSmrg 970a2dc1f3fSmrg#if __cplusplus >= 201703L 971a2dc1f3fSmrg /** 972a2dc1f3fSmrg * @brief Opens an external file. 973a2dc1f3fSmrg * @param __s The name of the file, as a filesystem::path. 974a2dc1f3fSmrg * @param __mode The open mode flags. 975a2dc1f3fSmrg * 976a2dc1f3fSmrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 977a2dc1f3fSmrg * function fails, @c failbit is set in the stream's error state. 978a2dc1f3fSmrg */ 979a2dc1f3fSmrg template<typename _Path> 980a2dc1f3fSmrg _If_fs_path<_Path, void> 981a2dc1f3fSmrg open(const _Path& __s, ios_base::openmode __mode = ios_base::out) 982a2dc1f3fSmrg { open(__s.c_str(), __mode); } 983a2dc1f3fSmrg#endif // C++17 984a2dc1f3fSmrg#endif // C++11 9851debfc3dSmrg 9861debfc3dSmrg /** 9871debfc3dSmrg * @brief Close the file. 9881debfc3dSmrg * 9891debfc3dSmrg * Calls @c std::basic_filebuf::close(). If that function 9901debfc3dSmrg * fails, @c failbit is set in the stream's error state. 9911debfc3dSmrg */ 9921debfc3dSmrg void 9931debfc3dSmrg close() 9941debfc3dSmrg { 9951debfc3dSmrg if (!_M_filebuf.close()) 9961debfc3dSmrg this->setstate(ios_base::failbit); 9971debfc3dSmrg } 9981debfc3dSmrg }; 9991debfc3dSmrg 10001debfc3dSmrg 10011debfc3dSmrg // [27.8.1.11] Template class basic_fstream 10021debfc3dSmrg /** 10031debfc3dSmrg * @brief Controlling input and output for files. 10041debfc3dSmrg * @ingroup io 10051debfc3dSmrg * 10061debfc3dSmrg * @tparam _CharT Type of character stream. 10071debfc3dSmrg * @tparam _Traits Traits for character type, defaults to 10081debfc3dSmrg * char_traits<_CharT>. 10091debfc3dSmrg * 10101debfc3dSmrg * This class supports reading from and writing to named files, using 10111debfc3dSmrg * the inherited functions from std::basic_iostream. To control the 10121debfc3dSmrg * associated sequence, an instance of std::basic_filebuf is used, which 10131debfc3dSmrg * this page refers to as @c sb. 10141debfc3dSmrg */ 10151debfc3dSmrg template<typename _CharT, typename _Traits> 10161debfc3dSmrg class basic_fstream : public basic_iostream<_CharT, _Traits> 10171debfc3dSmrg { 10181debfc3dSmrg public: 10191debfc3dSmrg // Types: 10201debfc3dSmrg typedef _CharT char_type; 10211debfc3dSmrg typedef _Traits traits_type; 10221debfc3dSmrg typedef typename traits_type::int_type int_type; 10231debfc3dSmrg typedef typename traits_type::pos_type pos_type; 10241debfc3dSmrg typedef typename traits_type::off_type off_type; 10251debfc3dSmrg 10261debfc3dSmrg // Non-standard types: 10271debfc3dSmrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 10281debfc3dSmrg typedef basic_ios<char_type, traits_type> __ios_type; 10291debfc3dSmrg typedef basic_iostream<char_type, traits_type> __iostream_type; 10301debfc3dSmrg 10311debfc3dSmrg private: 10321debfc3dSmrg __filebuf_type _M_filebuf; 10331debfc3dSmrg 10341debfc3dSmrg public: 10351debfc3dSmrg // Constructors/destructor: 10361debfc3dSmrg /** 10371debfc3dSmrg * @brief Default constructor. 10381debfc3dSmrg * 10391debfc3dSmrg * Initializes @c sb using its default constructor, and passes 10401debfc3dSmrg * @c &sb to the base class initializer. Does not open any files 10411debfc3dSmrg * (you haven't given it a filename to open). 10421debfc3dSmrg */ 10431debfc3dSmrg basic_fstream() 10441debfc3dSmrg : __iostream_type(), _M_filebuf() 10451debfc3dSmrg { this->init(&_M_filebuf); } 10461debfc3dSmrg 10471debfc3dSmrg /** 10481debfc3dSmrg * @brief Create an input/output file stream. 10491debfc3dSmrg * @param __s Null terminated string specifying the filename. 10501debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 10511debfc3dSmrg */ 10521debfc3dSmrg explicit 10531debfc3dSmrg basic_fstream(const char* __s, 10541debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 10551debfc3dSmrg : __iostream_type(0), _M_filebuf() 10561debfc3dSmrg { 10571debfc3dSmrg this->init(&_M_filebuf); 10581debfc3dSmrg this->open(__s, __mode); 10591debfc3dSmrg } 10601debfc3dSmrg 1061c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 1062c0a68be4Smrg /** 1063c0a68be4Smrg * @param Create an input/output file stream. 1064c0a68be4Smrg * @param __s Wide string specifying the filename. 1065c0a68be4Smrg * @param __mode Open file in specified mode (see std::ios_base). 1066c0a68be4Smrg */ 1067c0a68be4Smrg basic_fstream(const wchar_t* __s, 1068c0a68be4Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1069c0a68be4Smrg : __iostream_type(0), _M_filebuf() 1070c0a68be4Smrg { 1071c0a68be4Smrg this->init(&_M_filebuf); 1072c0a68be4Smrg this->open(__s, __mode); 1073c0a68be4Smrg } 1074c0a68be4Smrg#endif 1075c0a68be4Smrg 10761debfc3dSmrg#if __cplusplus >= 201103L 10771debfc3dSmrg /** 10781debfc3dSmrg * @brief Create an input/output file stream. 10791debfc3dSmrg * @param __s Null terminated string specifying the filename. 10801debfc3dSmrg * @param __mode Open file in specified mode (see std::ios_base). 10811debfc3dSmrg */ 10821debfc3dSmrg explicit 10831debfc3dSmrg basic_fstream(const std::string& __s, 10841debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 10851debfc3dSmrg : __iostream_type(0), _M_filebuf() 10861debfc3dSmrg { 10871debfc3dSmrg this->init(&_M_filebuf); 10881debfc3dSmrg this->open(__s, __mode); 10891debfc3dSmrg } 10901debfc3dSmrg 1091a2dc1f3fSmrg#if __cplusplus >= 201703L 1092a2dc1f3fSmrg /** 1093*8feb0f0bSmrg * @brief Create an input/output file stream. 1094a2dc1f3fSmrg * @param __s filesystem::path specifying the filename. 1095a2dc1f3fSmrg * @param __mode Open file in specified mode (see std::ios_base). 1096a2dc1f3fSmrg */ 1097a2dc1f3fSmrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 1098a2dc1f3fSmrg basic_fstream(const _Path& __s, 1099a2dc1f3fSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1100a2dc1f3fSmrg : basic_fstream(__s.c_str(), __mode) 1101a2dc1f3fSmrg { } 1102a2dc1f3fSmrg#endif // C++17 1103a2dc1f3fSmrg 11041debfc3dSmrg basic_fstream(const basic_fstream&) = delete; 11051debfc3dSmrg 11061debfc3dSmrg basic_fstream(basic_fstream&& __rhs) 11071debfc3dSmrg : __iostream_type(std::move(__rhs)), 11081debfc3dSmrg _M_filebuf(std::move(__rhs._M_filebuf)) 11091debfc3dSmrg { __iostream_type::set_rdbuf(&_M_filebuf); } 11101debfc3dSmrg#endif 11111debfc3dSmrg 11121debfc3dSmrg /** 11131debfc3dSmrg * @brief The destructor does nothing. 11141debfc3dSmrg * 11151debfc3dSmrg * The file is closed by the filebuf object, not the formatting 11161debfc3dSmrg * stream. 11171debfc3dSmrg */ 11181debfc3dSmrg ~basic_fstream() 11191debfc3dSmrg { } 11201debfc3dSmrg 11211debfc3dSmrg#if __cplusplus >= 201103L 11221debfc3dSmrg // 27.8.3.2 Assign and swap: 11231debfc3dSmrg 11241debfc3dSmrg basic_fstream& 11251debfc3dSmrg operator=(const basic_fstream&) = delete; 11261debfc3dSmrg 11271debfc3dSmrg basic_fstream& 11281debfc3dSmrg operator=(basic_fstream&& __rhs) 11291debfc3dSmrg { 11301debfc3dSmrg __iostream_type::operator=(std::move(__rhs)); 11311debfc3dSmrg _M_filebuf = std::move(__rhs._M_filebuf); 11321debfc3dSmrg return *this; 11331debfc3dSmrg } 11341debfc3dSmrg 11351debfc3dSmrg void 11361debfc3dSmrg swap(basic_fstream& __rhs) 11371debfc3dSmrg { 11381debfc3dSmrg __iostream_type::swap(__rhs); 11391debfc3dSmrg _M_filebuf.swap(__rhs._M_filebuf); 11401debfc3dSmrg } 11411debfc3dSmrg#endif 11421debfc3dSmrg 11431debfc3dSmrg // Members: 11441debfc3dSmrg /** 11451debfc3dSmrg * @brief Accessing the underlying buffer. 11461debfc3dSmrg * @return The current basic_filebuf buffer. 11471debfc3dSmrg * 11481debfc3dSmrg * This hides both signatures of std::basic_ios::rdbuf(). 11491debfc3dSmrg */ 11501debfc3dSmrg __filebuf_type* 11511debfc3dSmrg rdbuf() const 11521debfc3dSmrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 11531debfc3dSmrg 11541debfc3dSmrg /** 11551debfc3dSmrg * @brief Wrapper to test for an open file. 11561debfc3dSmrg * @return @c rdbuf()->is_open() 11571debfc3dSmrg */ 11581debfc3dSmrg bool 11591debfc3dSmrg is_open() 11601debfc3dSmrg { return _M_filebuf.is_open(); } 11611debfc3dSmrg 11621debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 11631debfc3dSmrg // 365. Lack of const-qualification in clause 27 11641debfc3dSmrg bool 11651debfc3dSmrg is_open() const 11661debfc3dSmrg { return _M_filebuf.is_open(); } 11671debfc3dSmrg 11681debfc3dSmrg /** 11691debfc3dSmrg * @brief Opens an external file. 11701debfc3dSmrg * @param __s The name of the file. 11711debfc3dSmrg * @param __mode The open mode flags. 11721debfc3dSmrg * 11731debfc3dSmrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 11741debfc3dSmrg * function fails, @c failbit is set in the stream's error state. 11751debfc3dSmrg */ 11761debfc3dSmrg void 11771debfc3dSmrg open(const char* __s, 11781debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 11791debfc3dSmrg { 11801debfc3dSmrg if (!_M_filebuf.open(__s, __mode)) 11811debfc3dSmrg this->setstate(ios_base::failbit); 11821debfc3dSmrg else 11831debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 11841debfc3dSmrg // 409. Closing an fstream should clear error state 11851debfc3dSmrg this->clear(); 11861debfc3dSmrg } 11871debfc3dSmrg 1188c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 1189c0a68be4Smrg /** 1190c0a68be4Smrg * @brief Opens an external file. 1191c0a68be4Smrg * @param __s The name of the file. 1192c0a68be4Smrg * @param __mode The open mode flags. 1193c0a68be4Smrg * 1194c0a68be4Smrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 1195c0a68be4Smrg * function fails, @c failbit is set in the stream's error state. 1196c0a68be4Smrg */ 1197c0a68be4Smrg void 1198c0a68be4Smrg open(const wchar_t* __s, 1199c0a68be4Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1200c0a68be4Smrg { 1201c0a68be4Smrg if (!_M_filebuf.open(__s, __mode)) 1202c0a68be4Smrg this->setstate(ios_base::failbit); 1203c0a68be4Smrg else 1204c0a68be4Smrg this->clear(); 1205c0a68be4Smrg } 1206c0a68be4Smrg#endif 1207c0a68be4Smrg 12081debfc3dSmrg#if __cplusplus >= 201103L 12091debfc3dSmrg /** 12101debfc3dSmrg * @brief Opens an external file. 12111debfc3dSmrg * @param __s The name of the file. 12121debfc3dSmrg * @param __mode The open mode flags. 12131debfc3dSmrg * 12141debfc3dSmrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 12151debfc3dSmrg * function fails, @c failbit is set in the stream's error state. 12161debfc3dSmrg */ 12171debfc3dSmrg void 12181debfc3dSmrg open(const std::string& __s, 12191debfc3dSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 12201debfc3dSmrg { 12211debfc3dSmrg if (!_M_filebuf.open(__s, __mode)) 12221debfc3dSmrg this->setstate(ios_base::failbit); 12231debfc3dSmrg else 12241debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 12251debfc3dSmrg // 409. Closing an fstream should clear error state 12261debfc3dSmrg this->clear(); 12271debfc3dSmrg } 1228a2dc1f3fSmrg 1229a2dc1f3fSmrg#if __cplusplus >= 201703L 1230a2dc1f3fSmrg /** 1231a2dc1f3fSmrg * @brief Opens an external file. 1232a2dc1f3fSmrg * @param __s The name of the file, as a filesystem::path. 1233a2dc1f3fSmrg * @param __mode The open mode flags. 1234a2dc1f3fSmrg * 1235a2dc1f3fSmrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 1236a2dc1f3fSmrg * function fails, @c failbit is set in the stream's error state. 1237a2dc1f3fSmrg */ 1238a2dc1f3fSmrg template<typename _Path> 1239a2dc1f3fSmrg _If_fs_path<_Path, void> 1240a2dc1f3fSmrg open(const _Path& __s, 1241a2dc1f3fSmrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1242a2dc1f3fSmrg { open(__s.c_str(), __mode); } 1243a2dc1f3fSmrg#endif // C++17 1244a2dc1f3fSmrg#endif // C++11 12451debfc3dSmrg 12461debfc3dSmrg /** 12471debfc3dSmrg * @brief Close the file. 12481debfc3dSmrg * 12491debfc3dSmrg * Calls @c std::basic_filebuf::close(). If that function 12501debfc3dSmrg * fails, @c failbit is set in the stream's error state. 12511debfc3dSmrg */ 12521debfc3dSmrg void 12531debfc3dSmrg close() 12541debfc3dSmrg { 12551debfc3dSmrg if (!_M_filebuf.close()) 12561debfc3dSmrg this->setstate(ios_base::failbit); 12571debfc3dSmrg } 12581debfc3dSmrg }; 12591debfc3dSmrg 12601debfc3dSmrg#if __cplusplus >= 201103L 12611debfc3dSmrg /// Swap specialization for filebufs. 12621debfc3dSmrg template <class _CharT, class _Traits> 12631debfc3dSmrg inline void 12641debfc3dSmrg swap(basic_filebuf<_CharT, _Traits>& __x, 12651debfc3dSmrg basic_filebuf<_CharT, _Traits>& __y) 12661debfc3dSmrg { __x.swap(__y); } 12671debfc3dSmrg 12681debfc3dSmrg /// Swap specialization for ifstreams. 12691debfc3dSmrg template <class _CharT, class _Traits> 12701debfc3dSmrg inline void 12711debfc3dSmrg swap(basic_ifstream<_CharT, _Traits>& __x, 12721debfc3dSmrg basic_ifstream<_CharT, _Traits>& __y) 12731debfc3dSmrg { __x.swap(__y); } 12741debfc3dSmrg 12751debfc3dSmrg /// Swap specialization for ofstreams. 12761debfc3dSmrg template <class _CharT, class _Traits> 12771debfc3dSmrg inline void 12781debfc3dSmrg swap(basic_ofstream<_CharT, _Traits>& __x, 12791debfc3dSmrg basic_ofstream<_CharT, _Traits>& __y) 12801debfc3dSmrg { __x.swap(__y); } 12811debfc3dSmrg 12821debfc3dSmrg /// Swap specialization for fstreams. 12831debfc3dSmrg template <class _CharT, class _Traits> 12841debfc3dSmrg inline void 12851debfc3dSmrg swap(basic_fstream<_CharT, _Traits>& __x, 12861debfc3dSmrg basic_fstream<_CharT, _Traits>& __y) 12871debfc3dSmrg { __x.swap(__y); } 12881debfc3dSmrg#endif 12891debfc3dSmrg 12901debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION 12911debfc3dSmrg} // namespace 12921debfc3dSmrg 12931debfc3dSmrg#include <bits/fstream.tcc> 12941debfc3dSmrg 12951debfc3dSmrg#endif /* _GLIBCXX_FSTREAM */ 1296