14fee23f9Smrg// File based streams -*- C++ -*- 24fee23f9Smrg 3*b1e83836Smrg// Copyright (C) 1997-2022 Free Software Foundation, Inc. 44fee23f9Smrg// 54fee23f9Smrg// This file is part of the GNU ISO C++ Library. This library is free 64fee23f9Smrg// software; you can redistribute it and/or modify it under the 74fee23f9Smrg// terms of the GNU General Public License as published by the 84fee23f9Smrg// Free Software Foundation; either version 3, or (at your option) 94fee23f9Smrg// any later version. 104fee23f9Smrg 114fee23f9Smrg// This library is distributed in the hope that it will be useful, 124fee23f9Smrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 134fee23f9Smrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 144fee23f9Smrg// GNU General Public License for more details. 154fee23f9Smrg 164fee23f9Smrg// Under Section 7 of GPL version 3, you are granted additional 174fee23f9Smrg// permissions described in the GCC Runtime Library Exception, version 184fee23f9Smrg// 3.1, as published by the Free Software Foundation. 194fee23f9Smrg 204fee23f9Smrg// You should have received a copy of the GNU General Public License and 214fee23f9Smrg// a copy of the GCC Runtime Library Exception along with this program; 224fee23f9Smrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 234fee23f9Smrg// <http://www.gnu.org/licenses/>. 244fee23f9Smrg 2548fb7bfaSmrg/** @file include/fstream 264fee23f9Smrg * This is a Standard C++ Library header. 274fee23f9Smrg */ 284fee23f9Smrg 294fee23f9Smrg// 304fee23f9Smrg// ISO C++ 14882: 27.8 File-based streams 314fee23f9Smrg// 324fee23f9Smrg 334fee23f9Smrg#ifndef _GLIBCXX_FSTREAM 344fee23f9Smrg#define _GLIBCXX_FSTREAM 1 354fee23f9Smrg 364fee23f9Smrg#pragma GCC system_header 374fee23f9Smrg 384fee23f9Smrg#include <istream> 394fee23f9Smrg#include <ostream> 404fee23f9Smrg#include <bits/codecvt.h> 414fee23f9Smrg#include <cstdio> // For BUFSIZ 424fee23f9Smrg#include <bits/basic_file.h> // For __basic_file, __c_lock 4348fb7bfaSmrg#if __cplusplus >= 201103L 444fee23f9Smrg#include <string> // For std::string overloads. 454fee23f9Smrg#endif 464fee23f9Smrg 47*b1e83836Smrg// This can be overridden by the target's os_defines.h 48*b1e83836Smrg#ifndef _GLIBCXX_BUFSIZ 49*b1e83836Smrg# define _GLIBCXX_BUFSIZ BUFSIZ 50*b1e83836Smrg#endif 51*b1e83836Smrg 5248fb7bfaSmrgnamespace std _GLIBCXX_VISIBILITY(default) 5348fb7bfaSmrg{ 5448fb7bfaSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 554fee23f9Smrg 56a3e9eb18Smrg#if __cplusplus >= 201703L 57a3e9eb18Smrg // Enable if _Path is a filesystem::path or experimental::filesystem::path 58a3e9eb18Smrg template<typename _Path, typename _Result = _Path, typename _Path2 59a3e9eb18Smrg = decltype(std::declval<_Path&>().make_preferred().filename())> 60a3e9eb18Smrg using _If_fs_path = enable_if_t<is_same_v<_Path, _Path2>, _Result>; 61a3e9eb18Smrg#endif // C++17 62a3e9eb18Smrg 63a3e9eb18Smrg 644fee23f9Smrg // [27.8.1.1] template class basic_filebuf 654fee23f9Smrg /** 664fee23f9Smrg * @brief The actual work of input and output (for files). 674fee23f9Smrg * @ingroup io 684fee23f9Smrg * 6948fb7bfaSmrg * @tparam _CharT Type of character stream. 7048fb7bfaSmrg * @tparam _Traits Traits for character type, defaults to 7148fb7bfaSmrg * char_traits<_CharT>. 7248fb7bfaSmrg * 734fee23f9Smrg * This class associates both its input and output sequence with an 744fee23f9Smrg * external disk file, and maintains a joint file position for both 754fee23f9Smrg * sequences. Many of its semantics are described in terms of similar 764fee23f9Smrg * behavior in the Standard C Library's @c FILE streams. 7748fb7bfaSmrg * 7848fb7bfaSmrg * Requirements on traits_type, specific to this class: 7948fb7bfaSmrg * - traits_type::pos_type must be fpos<traits_type::state_type> 8048fb7bfaSmrg * - traits_type::off_type must be streamoff 8148fb7bfaSmrg * - traits_type::state_type must be Assignable and DefaultConstructible, 8248fb7bfaSmrg * - traits_type::state_type() must be the initial state for codecvt. 834fee23f9Smrg */ 844fee23f9Smrg template<typename _CharT, typename _Traits> 854fee23f9Smrg class basic_filebuf : public basic_streambuf<_CharT, _Traits> 864fee23f9Smrg { 874d5abbe8Smrg#if __cplusplus >= 201103L 884d5abbe8Smrg template<typename _Tp> 894d5abbe8Smrg using __chk_state = __and_<is_copy_assignable<_Tp>, 904d5abbe8Smrg is_copy_constructible<_Tp>, 914d5abbe8Smrg is_default_constructible<_Tp>>; 924d5abbe8Smrg 934d5abbe8Smrg static_assert(__chk_state<typename _Traits::state_type>::value, 944d5abbe8Smrg "state_type must be CopyAssignable, CopyConstructible" 954d5abbe8Smrg " and DefaultConstructible"); 964d5abbe8Smrg 974d5abbe8Smrg static_assert(is_same<typename _Traits::pos_type, 984d5abbe8Smrg fpos<typename _Traits::state_type>>::value, 994d5abbe8Smrg "pos_type must be fpos<state_type>"); 1004d5abbe8Smrg#endif 1014fee23f9Smrg public: 1024fee23f9Smrg // Types: 1034fee23f9Smrg typedef _CharT char_type; 1044fee23f9Smrg typedef _Traits traits_type; 1054fee23f9Smrg typedef typename traits_type::int_type int_type; 1064fee23f9Smrg typedef typename traits_type::pos_type pos_type; 1074fee23f9Smrg typedef typename traits_type::off_type off_type; 1084fee23f9Smrg 1094fee23f9Smrg typedef basic_streambuf<char_type, traits_type> __streambuf_type; 1104fee23f9Smrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 1114fee23f9Smrg typedef __basic_file<char> __file_type; 1124fee23f9Smrg typedef typename traits_type::state_type __state_type; 1134fee23f9Smrg typedef codecvt<char_type, char, __state_type> __codecvt_type; 1144fee23f9Smrg 1154fee23f9Smrg friend class ios_base; // For sync_with_stdio. 1164fee23f9Smrg 1174fee23f9Smrg protected: 1184fee23f9Smrg // Data Members: 1194fee23f9Smrg // MT lock inherited from libio or other low-level io library. 1204fee23f9Smrg __c_lock _M_lock; 1214fee23f9Smrg 1224fee23f9Smrg // External buffer. 1234fee23f9Smrg __file_type _M_file; 1244fee23f9Smrg 1254fee23f9Smrg /// Place to stash in || out || in | out settings for current filebuf. 1264fee23f9Smrg ios_base::openmode _M_mode; 1274fee23f9Smrg 1284fee23f9Smrg // Beginning state type for codecvt. 1294fee23f9Smrg __state_type _M_state_beg; 1304fee23f9Smrg 1314fee23f9Smrg // During output, the state that corresponds to pptr(), 1324fee23f9Smrg // during input, the state that corresponds to egptr() and 1334fee23f9Smrg // _M_ext_next. 1344fee23f9Smrg __state_type _M_state_cur; 1354fee23f9Smrg 1364fee23f9Smrg // Not used for output. During input, the state that corresponds 1374fee23f9Smrg // to eback() and _M_ext_buf. 1384fee23f9Smrg __state_type _M_state_last; 1394fee23f9Smrg 1404fee23f9Smrg /// Pointer to the beginning of internal buffer. 1414fee23f9Smrg char_type* _M_buf; 1424fee23f9Smrg 1434fee23f9Smrg /** 1444fee23f9Smrg * Actual size of internal buffer. This number is equal to the size 1454fee23f9Smrg * of the put area + 1 position, reserved for the overflow char of 1464fee23f9Smrg * a full area. 1474fee23f9Smrg */ 1484fee23f9Smrg size_t _M_buf_size; 1494fee23f9Smrg 1504fee23f9Smrg // Set iff _M_buf is allocated memory from _M_allocate_internal_buffer. 1514fee23f9Smrg bool _M_buf_allocated; 1524fee23f9Smrg 1534fee23f9Smrg /** 1544fee23f9Smrg * _M_reading == false && _M_writing == false for @b uncommitted mode; 1554fee23f9Smrg * _M_reading == true for @b read mode; 1564fee23f9Smrg * _M_writing == true for @b write mode; 1574fee23f9Smrg * 1584fee23f9Smrg * NB: _M_reading == true && _M_writing == true is unused. 1594fee23f9Smrg */ 1604fee23f9Smrg bool _M_reading; 1614fee23f9Smrg bool _M_writing; 1624fee23f9Smrg 163a448f87cSmrg ///@{ 1644fee23f9Smrg /** 1654fee23f9Smrg * Necessary bits for putback buffer management. 1664fee23f9Smrg * 1674fee23f9Smrg * @note pbacks of over one character are not currently supported. 1684fee23f9Smrg */ 1694fee23f9Smrg char_type _M_pback; 1704fee23f9Smrg char_type* _M_pback_cur_save; 1714fee23f9Smrg char_type* _M_pback_end_save; 1724fee23f9Smrg bool _M_pback_init; 173a448f87cSmrg ///@} 1744fee23f9Smrg 1754fee23f9Smrg // Cached codecvt facet. 1764fee23f9Smrg const __codecvt_type* _M_codecvt; 1774fee23f9Smrg 1784fee23f9Smrg /** 1794fee23f9Smrg * Buffer for external characters. Used for input when 1804fee23f9Smrg * codecvt::always_noconv() == false. When valid, this corresponds 1814fee23f9Smrg * to eback(). 1824fee23f9Smrg */ 1834fee23f9Smrg char* _M_ext_buf; 1844fee23f9Smrg 1854fee23f9Smrg /** 1864fee23f9Smrg * Size of buffer held by _M_ext_buf. 1874fee23f9Smrg */ 1884fee23f9Smrg streamsize _M_ext_buf_size; 1894fee23f9Smrg 1904fee23f9Smrg /** 1914fee23f9Smrg * Pointers into the buffer held by _M_ext_buf that delimit a 1924fee23f9Smrg * subsequence of bytes that have been read but not yet converted. 1934fee23f9Smrg * When valid, _M_ext_next corresponds to egptr(). 1944fee23f9Smrg */ 1954fee23f9Smrg const char* _M_ext_next; 1964fee23f9Smrg char* _M_ext_end; 1974fee23f9Smrg 1984fee23f9Smrg /** 1994fee23f9Smrg * Initializes pback buffers, and moves normal buffers to safety. 2004fee23f9Smrg * Assumptions: 2014fee23f9Smrg * _M_in_cur has already been moved back 2024fee23f9Smrg */ 2034fee23f9Smrg void 2044fee23f9Smrg _M_create_pback() 2054fee23f9Smrg { 2064fee23f9Smrg if (!_M_pback_init) 2074fee23f9Smrg { 2084fee23f9Smrg _M_pback_cur_save = this->gptr(); 2094fee23f9Smrg _M_pback_end_save = this->egptr(); 2104fee23f9Smrg this->setg(&_M_pback, &_M_pback, &_M_pback + 1); 2114fee23f9Smrg _M_pback_init = true; 2124fee23f9Smrg } 2134fee23f9Smrg } 2144fee23f9Smrg 2154fee23f9Smrg /** 2164fee23f9Smrg * Deactivates pback buffer contents, and restores normal buffer. 2174fee23f9Smrg * Assumptions: 2184fee23f9Smrg * The pback buffer has only moved forward. 2194fee23f9Smrg */ 2204fee23f9Smrg void 2214fee23f9Smrg _M_destroy_pback() throw() 2224fee23f9Smrg { 2234fee23f9Smrg if (_M_pback_init) 2244fee23f9Smrg { 2254fee23f9Smrg // Length _M_in_cur moved in the pback buffer. 2264fee23f9Smrg _M_pback_cur_save += this->gptr() != this->eback(); 2274fee23f9Smrg this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save); 2284fee23f9Smrg _M_pback_init = false; 2294fee23f9Smrg } 2304fee23f9Smrg } 2314fee23f9Smrg 2324fee23f9Smrg public: 2334fee23f9Smrg // Constructors/destructor: 2344fee23f9Smrg /** 2354fee23f9Smrg * @brief Does not open any files. 2364fee23f9Smrg * 2374fee23f9Smrg * The default constructor initializes the parent class using its 2384fee23f9Smrg * own default ctor. 2394fee23f9Smrg */ 2404fee23f9Smrg basic_filebuf(); 2414fee23f9Smrg 2424d5abbe8Smrg#if __cplusplus >= 201103L 2434d5abbe8Smrg basic_filebuf(const basic_filebuf&) = delete; 2444d5abbe8Smrg basic_filebuf(basic_filebuf&&); 2454d5abbe8Smrg#endif 2464d5abbe8Smrg 2474fee23f9Smrg /** 2484fee23f9Smrg * @brief The destructor closes the file first. 2494fee23f9Smrg */ 2504fee23f9Smrg virtual 2514fee23f9Smrg ~basic_filebuf() 252181254a7Smrg { 253181254a7Smrg __try 2544fee23f9Smrg { this->close(); } 255181254a7Smrg __catch(...) 256181254a7Smrg { } 257181254a7Smrg } 2584fee23f9Smrg 2594d5abbe8Smrg#if __cplusplus >= 201103L 2604d5abbe8Smrg basic_filebuf& operator=(const basic_filebuf&) = delete; 2614d5abbe8Smrg basic_filebuf& operator=(basic_filebuf&&); 2624d5abbe8Smrg void swap(basic_filebuf&); 2634d5abbe8Smrg#endif 2644d5abbe8Smrg 2654fee23f9Smrg // Members: 2664fee23f9Smrg /** 2674fee23f9Smrg * @brief Returns true if the external file is open. 2684fee23f9Smrg */ 2694fee23f9Smrg bool 2704fee23f9Smrg is_open() const throw() 2714fee23f9Smrg { return _M_file.is_open(); } 2724fee23f9Smrg 2734fee23f9Smrg /** 2744fee23f9Smrg * @brief Opens an external file. 27548fb7bfaSmrg * @param __s The name of the file. 27648fb7bfaSmrg * @param __mode The open mode flags. 2774fee23f9Smrg * @return @c this on success, NULL on failure 2784fee23f9Smrg * 2794fee23f9Smrg * If a file is already open, this function immediately fails. 28048fb7bfaSmrg * Otherwise it tries to open the file named @a __s using the flags 28148fb7bfaSmrg * given in @a __mode. 2824fee23f9Smrg * 2834fee23f9Smrg * Table 92, adapted here, gives the relation between openmode 2844d5abbe8Smrg * combinations and the equivalent @c fopen() flags. 2854fee23f9Smrg * (NB: lines app, in|out|app, in|app, binary|app, binary|in|out|app, 2864fee23f9Smrg * and binary|in|app per DR 596) 2874d5abbe8Smrg * <pre> 2884fee23f9Smrg * +---------------------------------------------------------+ 2894fee23f9Smrg * | ios_base Flag combination stdio equivalent | 2904fee23f9Smrg * |binary in out trunc app | 2914fee23f9Smrg * +---------------------------------------------------------+ 2924fee23f9Smrg * | + w | 2934fee23f9Smrg * | + + a | 2944fee23f9Smrg * | + a | 2954fee23f9Smrg * | + + w | 2964fee23f9Smrg * | + r | 2974fee23f9Smrg * | + + r+ | 2984fee23f9Smrg * | + + + w+ | 2994fee23f9Smrg * | + + + a+ | 3004fee23f9Smrg * | + + a+ | 3014fee23f9Smrg * +---------------------------------------------------------+ 3024fee23f9Smrg * | + + wb | 3034fee23f9Smrg * | + + + ab | 3044fee23f9Smrg * | + + ab | 3054fee23f9Smrg * | + + + wb | 3064fee23f9Smrg * | + + rb | 3074fee23f9Smrg * | + + + r+b | 3084fee23f9Smrg * | + + + + w+b | 3094fee23f9Smrg * | + + + + a+b | 3104fee23f9Smrg * | + + + a+b | 3114fee23f9Smrg * +---------------------------------------------------------+ 3124d5abbe8Smrg * </pre> 3134fee23f9Smrg */ 3144fee23f9Smrg __filebuf_type* 3154fee23f9Smrg open(const char* __s, ios_base::openmode __mode); 3164fee23f9Smrg 317181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 318181254a7Smrg /** 319181254a7Smrg * @brief Opens an external file. 320181254a7Smrg * @param __s The name of the file, as a wide character string. 321181254a7Smrg * @param __mode The open mode flags. 322181254a7Smrg * @return @c this on success, NULL on failure 323181254a7Smrg */ 324181254a7Smrg __filebuf_type* 325181254a7Smrg open(const wchar_t* __s, ios_base::openmode __mode); 326181254a7Smrg#endif 327181254a7Smrg 32848fb7bfaSmrg#if __cplusplus >= 201103L 3294fee23f9Smrg /** 3304fee23f9Smrg * @brief Opens an external file. 33148fb7bfaSmrg * @param __s The name of the file. 33248fb7bfaSmrg * @param __mode The open mode flags. 3334fee23f9Smrg * @return @c this on success, NULL on failure 3344fee23f9Smrg */ 3354fee23f9Smrg __filebuf_type* 3364fee23f9Smrg open(const std::string& __s, ios_base::openmode __mode) 3374fee23f9Smrg { return open(__s.c_str(), __mode); } 338a3e9eb18Smrg 339a3e9eb18Smrg#if __cplusplus >= 201703L 340a3e9eb18Smrg /** 341a3e9eb18Smrg * @brief Opens an external file. 342a3e9eb18Smrg * @param __s The name of the file, as a filesystem::path. 343a3e9eb18Smrg * @param __mode The open mode flags. 344a3e9eb18Smrg * @return @c this on success, NULL on failure 345a3e9eb18Smrg */ 346a3e9eb18Smrg template<typename _Path> 347a3e9eb18Smrg _If_fs_path<_Path, __filebuf_type*> 348a3e9eb18Smrg open(const _Path& __s, ios_base::openmode __mode) 349a3e9eb18Smrg { return open(__s.c_str(), __mode); } 350a3e9eb18Smrg#endif // C++17 351a3e9eb18Smrg#endif // C++11 3524fee23f9Smrg 3534fee23f9Smrg /** 3544fee23f9Smrg * @brief Closes the currently associated file. 3554fee23f9Smrg * @return @c this on success, NULL on failure 3564fee23f9Smrg * 3574fee23f9Smrg * If no file is currently open, this function immediately fails. 3584fee23f9Smrg * 3594fee23f9Smrg * If a <em>put buffer area</em> exists, @c overflow(eof) is 3604fee23f9Smrg * called to flush all the characters. The file is then 3614fee23f9Smrg * closed. 3624fee23f9Smrg * 3634fee23f9Smrg * If any operations fail, this function also fails. 3644fee23f9Smrg */ 3654fee23f9Smrg __filebuf_type* 3664fee23f9Smrg close(); 3674fee23f9Smrg 3684fee23f9Smrg protected: 3694fee23f9Smrg void 3704fee23f9Smrg _M_allocate_internal_buffer(); 3714fee23f9Smrg 3724fee23f9Smrg void 3734fee23f9Smrg _M_destroy_internal_buffer() throw(); 3744fee23f9Smrg 3754fee23f9Smrg // [27.8.1.4] overridden virtual functions 3764fee23f9Smrg virtual streamsize 3774fee23f9Smrg showmanyc(); 3784fee23f9Smrg 3794fee23f9Smrg // Stroustrup, 1998, p. 628 3804fee23f9Smrg // underflow() and uflow() functions are called to get the next 3814fee23f9Smrg // character from the real input source when the buffer is empty. 3824fee23f9Smrg // Buffered input uses underflow() 3834fee23f9Smrg 3844fee23f9Smrg virtual int_type 3854fee23f9Smrg underflow(); 3864fee23f9Smrg 3874fee23f9Smrg virtual int_type 3884fee23f9Smrg pbackfail(int_type __c = _Traits::eof()); 3894fee23f9Smrg 3904fee23f9Smrg // Stroustrup, 1998, p 648 3914fee23f9Smrg // The overflow() function is called to transfer characters to the 3924fee23f9Smrg // real output destination when the buffer is full. A call to 3934fee23f9Smrg // overflow(c) outputs the contents of the buffer plus the 3944fee23f9Smrg // character c. 3954fee23f9Smrg // 27.5.2.4.5 3964fee23f9Smrg // Consume some sequence of the characters in the pending sequence. 3974fee23f9Smrg virtual int_type 3984fee23f9Smrg overflow(int_type __c = _Traits::eof()); 3994fee23f9Smrg 4004fee23f9Smrg // Convert internal byte sequence to external, char-based 4014fee23f9Smrg // sequence via codecvt. 4024fee23f9Smrg bool 4034fee23f9Smrg _M_convert_to_external(char_type*, streamsize); 4044fee23f9Smrg 4054fee23f9Smrg /** 4064fee23f9Smrg * @brief Manipulates the buffer. 40748fb7bfaSmrg * @param __s Pointer to a buffer area. 40848fb7bfaSmrg * @param __n Size of @a __s. 4094fee23f9Smrg * @return @c this 4104fee23f9Smrg * 41148fb7bfaSmrg * If no file has been opened, and both @a __s and @a __n are zero, then 41248fb7bfaSmrg * the stream becomes unbuffered. Otherwise, @c __s is used as a 4134fee23f9Smrg * buffer; see 4144d5abbe8Smrg * https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering 4154fee23f9Smrg * for more. 4164fee23f9Smrg */ 4174fee23f9Smrg virtual __streambuf_type* 4184fee23f9Smrg setbuf(char_type* __s, streamsize __n); 4194fee23f9Smrg 4204fee23f9Smrg virtual pos_type 4214fee23f9Smrg seekoff(off_type __off, ios_base::seekdir __way, 4224fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out); 4234fee23f9Smrg 4244fee23f9Smrg virtual pos_type 4254fee23f9Smrg seekpos(pos_type __pos, 4264fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out); 4274fee23f9Smrg 42848fb7bfaSmrg // Common code for seekoff, seekpos, and overflow 4294fee23f9Smrg pos_type 4304fee23f9Smrg _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state); 4314fee23f9Smrg 43248fb7bfaSmrg int 43348fb7bfaSmrg _M_get_ext_pos(__state_type &__state); 43448fb7bfaSmrg 4354fee23f9Smrg virtual int 4364fee23f9Smrg sync(); 4374fee23f9Smrg 4384fee23f9Smrg virtual void 4394fee23f9Smrg imbue(const locale& __loc); 4404fee23f9Smrg 4414fee23f9Smrg virtual streamsize 4424fee23f9Smrg xsgetn(char_type* __s, streamsize __n); 4434fee23f9Smrg 4444fee23f9Smrg virtual streamsize 4454fee23f9Smrg xsputn(const char_type* __s, streamsize __n); 4464fee23f9Smrg 4474fee23f9Smrg // Flushes output buffer, then writes unshift sequence. 4484fee23f9Smrg bool 4494fee23f9Smrg _M_terminate_output(); 4504fee23f9Smrg 4514fee23f9Smrg /** 4524fee23f9Smrg * This function sets the pointers of the internal buffer, both get 4534fee23f9Smrg * and put areas. Typically: 4544fee23f9Smrg * 4554fee23f9Smrg * __off == egptr() - eback() upon underflow/uflow (@b read mode); 4564fee23f9Smrg * __off == 0 upon overflow (@b write mode); 4574fee23f9Smrg * __off == -1 upon open, setbuf, seekoff/pos (@b uncommitted mode). 4584fee23f9Smrg * 4594fee23f9Smrg * NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size 4604fee23f9Smrg * reflects the actual allocated memory and the last cell is reserved 4614fee23f9Smrg * for the overflow char of a full put area. 4624fee23f9Smrg */ 4634fee23f9Smrg void 4644fee23f9Smrg _M_set_buffer(streamsize __off) 4654fee23f9Smrg { 4664fee23f9Smrg const bool __testin = _M_mode & ios_base::in; 4674d5abbe8Smrg const bool __testout = (_M_mode & ios_base::out 4684d5abbe8Smrg || _M_mode & ios_base::app); 4694fee23f9Smrg 4704fee23f9Smrg if (__testin && __off > 0) 4714fee23f9Smrg this->setg(_M_buf, _M_buf, _M_buf + __off); 4724fee23f9Smrg else 4734fee23f9Smrg this->setg(_M_buf, _M_buf, _M_buf); 4744fee23f9Smrg 4754fee23f9Smrg if (__testout && __off == 0 && _M_buf_size > 1 ) 4764fee23f9Smrg this->setp(_M_buf, _M_buf + _M_buf_size - 1); 4774fee23f9Smrg else 47848fb7bfaSmrg this->setp(0, 0); 4794fee23f9Smrg } 4804fee23f9Smrg }; 4814fee23f9Smrg 4824fee23f9Smrg // [27.8.1.5] Template class basic_ifstream 4834fee23f9Smrg /** 4844fee23f9Smrg * @brief Controlling input for files. 4854fee23f9Smrg * @ingroup io 4864fee23f9Smrg * 48748fb7bfaSmrg * @tparam _CharT Type of character stream. 48848fb7bfaSmrg * @tparam _Traits Traits for character type, defaults to 48948fb7bfaSmrg * char_traits<_CharT>. 49048fb7bfaSmrg * 4914fee23f9Smrg * This class supports reading from named files, using the inherited 4924fee23f9Smrg * functions from std::basic_istream. To control the associated 4934fee23f9Smrg * sequence, an instance of std::basic_filebuf is used, which this page 4944fee23f9Smrg * refers to as @c sb. 4954fee23f9Smrg */ 4964fee23f9Smrg template<typename _CharT, typename _Traits> 4974fee23f9Smrg class basic_ifstream : public basic_istream<_CharT, _Traits> 4984fee23f9Smrg { 4994fee23f9Smrg public: 5004fee23f9Smrg // Types: 5014fee23f9Smrg typedef _CharT char_type; 5024fee23f9Smrg typedef _Traits traits_type; 5034fee23f9Smrg typedef typename traits_type::int_type int_type; 5044fee23f9Smrg typedef typename traits_type::pos_type pos_type; 5054fee23f9Smrg typedef typename traits_type::off_type off_type; 5064fee23f9Smrg 5074fee23f9Smrg // Non-standard types: 5084fee23f9Smrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 5094fee23f9Smrg typedef basic_istream<char_type, traits_type> __istream_type; 5104fee23f9Smrg 5114fee23f9Smrg private: 5124fee23f9Smrg __filebuf_type _M_filebuf; 5134fee23f9Smrg 5144fee23f9Smrg public: 5154fee23f9Smrg // Constructors/Destructors: 5164fee23f9Smrg /** 5174fee23f9Smrg * @brief Default constructor. 5184fee23f9Smrg * 5194fee23f9Smrg * Initializes @c sb using its default constructor, and passes 5204fee23f9Smrg * @c &sb to the base class initializer. Does not open any files 5214fee23f9Smrg * (you haven't given it a filename to open). 5224fee23f9Smrg */ 5234fee23f9Smrg basic_ifstream() : __istream_type(), _M_filebuf() 5244fee23f9Smrg { this->init(&_M_filebuf); } 5254fee23f9Smrg 5264fee23f9Smrg /** 5274fee23f9Smrg * @brief Create an input file stream. 52848fb7bfaSmrg * @param __s Null terminated string specifying the filename. 52948fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 5304fee23f9Smrg * 53148fb7bfaSmrg * @c ios_base::in is automatically included in @a __mode. 5324fee23f9Smrg */ 5334fee23f9Smrg explicit 5344fee23f9Smrg basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in) 5354fee23f9Smrg : __istream_type(), _M_filebuf() 5364fee23f9Smrg { 5374fee23f9Smrg this->init(&_M_filebuf); 5384fee23f9Smrg this->open(__s, __mode); 5394fee23f9Smrg } 5404fee23f9Smrg 541181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 542181254a7Smrg /** 543181254a7Smrg * @param Create an input file stream. 544181254a7Smrg * @param __s Wide string specifying the filename. 545181254a7Smrg * @param __mode Open file in specified mode (see std::ios_base). 546181254a7Smrg * 547181254a7Smrg * @c ios_base::in is automatically included in @a __mode. 548181254a7Smrg */ 549181254a7Smrg basic_ifstream(const wchar_t* __s, 550181254a7Smrg ios_base::openmode __mode = ios_base::in) 551181254a7Smrg : __istream_type(), _M_filebuf() 552181254a7Smrg { 553181254a7Smrg this->init(&_M_filebuf); 554181254a7Smrg this->open(__s, __mode); 555181254a7Smrg } 556181254a7Smrg#endif 557181254a7Smrg 55848fb7bfaSmrg#if __cplusplus >= 201103L 5594fee23f9Smrg /** 5604fee23f9Smrg * @brief Create an input file stream. 56148fb7bfaSmrg * @param __s std::string specifying the filename. 56248fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 5634fee23f9Smrg * 56448fb7bfaSmrg * @c ios_base::in is automatically included in @a __mode. 5654fee23f9Smrg */ 5664fee23f9Smrg explicit 5674fee23f9Smrg basic_ifstream(const std::string& __s, 5684fee23f9Smrg ios_base::openmode __mode = ios_base::in) 5694fee23f9Smrg : __istream_type(), _M_filebuf() 5704fee23f9Smrg { 5714fee23f9Smrg this->init(&_M_filebuf); 5724fee23f9Smrg this->open(__s, __mode); 5734fee23f9Smrg } 5744d5abbe8Smrg 575a3e9eb18Smrg#if __cplusplus >= 201703L 576a3e9eb18Smrg /** 577fb8a8121Smrg * @brief Create an input file stream. 578a3e9eb18Smrg * @param __s filesystem::path specifying the filename. 579a3e9eb18Smrg * @param __mode Open file in specified mode (see std::ios_base). 580a3e9eb18Smrg * 581a3e9eb18Smrg * @c ios_base::in is automatically included in @a __mode. 582a3e9eb18Smrg */ 583a3e9eb18Smrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 584a3e9eb18Smrg basic_ifstream(const _Path& __s, 585a3e9eb18Smrg ios_base::openmode __mode = ios_base::in) 586a3e9eb18Smrg : basic_ifstream(__s.c_str(), __mode) 587a3e9eb18Smrg { } 588a3e9eb18Smrg#endif // C++17 589a3e9eb18Smrg 5904d5abbe8Smrg basic_ifstream(const basic_ifstream&) = delete; 5914d5abbe8Smrg 5924d5abbe8Smrg basic_ifstream(basic_ifstream&& __rhs) 5934d5abbe8Smrg : __istream_type(std::move(__rhs)), 5944d5abbe8Smrg _M_filebuf(std::move(__rhs._M_filebuf)) 5954d5abbe8Smrg { __istream_type::set_rdbuf(&_M_filebuf); } 596a3e9eb18Smrg#endif // C++11 5974fee23f9Smrg 5984fee23f9Smrg /** 5994fee23f9Smrg * @brief The destructor does nothing. 6004fee23f9Smrg * 6014fee23f9Smrg * The file is closed by the filebuf object, not the formatting 6024fee23f9Smrg * stream. 6034fee23f9Smrg */ 6044fee23f9Smrg ~basic_ifstream() 6054fee23f9Smrg { } 6064fee23f9Smrg 6074d5abbe8Smrg#if __cplusplus >= 201103L 6084d5abbe8Smrg // 27.8.3.2 Assign and swap: 6094d5abbe8Smrg 6104d5abbe8Smrg basic_ifstream& 6114d5abbe8Smrg operator=(const basic_ifstream&) = delete; 6124d5abbe8Smrg 6134d5abbe8Smrg basic_ifstream& 6144d5abbe8Smrg operator=(basic_ifstream&& __rhs) 6154d5abbe8Smrg { 6164d5abbe8Smrg __istream_type::operator=(std::move(__rhs)); 6174d5abbe8Smrg _M_filebuf = std::move(__rhs._M_filebuf); 6184d5abbe8Smrg return *this; 6194d5abbe8Smrg } 6204d5abbe8Smrg 6214d5abbe8Smrg void 6224d5abbe8Smrg swap(basic_ifstream& __rhs) 6234d5abbe8Smrg { 6244d5abbe8Smrg __istream_type::swap(__rhs); 6254d5abbe8Smrg _M_filebuf.swap(__rhs._M_filebuf); 6264d5abbe8Smrg } 6274d5abbe8Smrg#endif 6284d5abbe8Smrg 6294fee23f9Smrg // Members: 6304fee23f9Smrg /** 6314fee23f9Smrg * @brief Accessing the underlying buffer. 6324fee23f9Smrg * @return The current basic_filebuf buffer. 6334fee23f9Smrg * 6344fee23f9Smrg * This hides both signatures of std::basic_ios::rdbuf(). 6354fee23f9Smrg */ 6364fee23f9Smrg __filebuf_type* 6374fee23f9Smrg rdbuf() const 6384fee23f9Smrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 6394fee23f9Smrg 6404fee23f9Smrg /** 6414fee23f9Smrg * @brief Wrapper to test for an open file. 6424fee23f9Smrg * @return @c rdbuf()->is_open() 6434fee23f9Smrg */ 6444fee23f9Smrg bool 6454fee23f9Smrg is_open() 6464fee23f9Smrg { return _M_filebuf.is_open(); } 6474fee23f9Smrg 6484fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 6494fee23f9Smrg // 365. Lack of const-qualification in clause 27 6504fee23f9Smrg bool 6514fee23f9Smrg is_open() const 6524fee23f9Smrg { return _M_filebuf.is_open(); } 6534fee23f9Smrg 6544fee23f9Smrg /** 6554fee23f9Smrg * @brief Opens an external file. 65648fb7bfaSmrg * @param __s The name of the file. 65748fb7bfaSmrg * @param __mode The open mode flags. 6584fee23f9Smrg * 65948fb7bfaSmrg * Calls @c std::basic_filebuf::open(s,__mode|in). If that function 6604fee23f9Smrg * fails, @c failbit is set in the stream's error state. 6614fee23f9Smrg */ 6624fee23f9Smrg void 6634fee23f9Smrg open(const char* __s, ios_base::openmode __mode = ios_base::in) 6644fee23f9Smrg { 6654fee23f9Smrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 6664fee23f9Smrg this->setstate(ios_base::failbit); 6674fee23f9Smrg else 6684fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 6694fee23f9Smrg // 409. Closing an fstream should clear error state 6704fee23f9Smrg this->clear(); 6714fee23f9Smrg } 6724fee23f9Smrg 673181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 674181254a7Smrg /** 675181254a7Smrg * @brief Opens an external file. 676181254a7Smrg * @param __s The name of the file, as a wide character string. 677181254a7Smrg * @param __mode The open mode flags. 678181254a7Smrg * 679181254a7Smrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 680181254a7Smrg * fails, @c failbit is set in the stream's error state. 681181254a7Smrg */ 682181254a7Smrg void 683181254a7Smrg open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in) 684181254a7Smrg { 685181254a7Smrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 686181254a7Smrg this->setstate(ios_base::failbit); 687181254a7Smrg else 688181254a7Smrg this->clear(); 689181254a7Smrg } 690181254a7Smrg#endif 691181254a7Smrg 69248fb7bfaSmrg#if __cplusplus >= 201103L 6934fee23f9Smrg /** 6944fee23f9Smrg * @brief Opens an external file. 69548fb7bfaSmrg * @param __s The name of the file. 69648fb7bfaSmrg * @param __mode The open mode flags. 6974fee23f9Smrg * 69848fb7bfaSmrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 6994fee23f9Smrg * fails, @c failbit is set in the stream's error state. 7004fee23f9Smrg */ 7014fee23f9Smrg void 7024fee23f9Smrg open(const std::string& __s, ios_base::openmode __mode = ios_base::in) 7034fee23f9Smrg { 7044fee23f9Smrg if (!_M_filebuf.open(__s, __mode | ios_base::in)) 7054fee23f9Smrg this->setstate(ios_base::failbit); 7064fee23f9Smrg else 7074fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 7084fee23f9Smrg // 409. Closing an fstream should clear error state 7094fee23f9Smrg this->clear(); 7104fee23f9Smrg } 711a3e9eb18Smrg 712a3e9eb18Smrg#if __cplusplus >= 201703L 713a3e9eb18Smrg /** 714a3e9eb18Smrg * @brief Opens an external file. 715a3e9eb18Smrg * @param __s The name of the file, as a filesystem::path. 716a3e9eb18Smrg * @param __mode The open mode flags. 717a3e9eb18Smrg * 718a3e9eb18Smrg * Calls @c std::basic_filebuf::open(__s,__mode|in). If that function 719a3e9eb18Smrg * fails, @c failbit is set in the stream's error state. 720a3e9eb18Smrg */ 721a3e9eb18Smrg template<typename _Path> 722a3e9eb18Smrg _If_fs_path<_Path, void> 723a3e9eb18Smrg open(const _Path& __s, ios_base::openmode __mode = ios_base::in) 724a3e9eb18Smrg { open(__s.c_str(), __mode); } 725a3e9eb18Smrg#endif // C++17 726a3e9eb18Smrg#endif // C++11 7274fee23f9Smrg 7284fee23f9Smrg /** 7294fee23f9Smrg * @brief Close the file. 7304fee23f9Smrg * 7314fee23f9Smrg * Calls @c std::basic_filebuf::close(). If that function 7324fee23f9Smrg * fails, @c failbit is set in the stream's error state. 7334fee23f9Smrg */ 7344fee23f9Smrg void 7354fee23f9Smrg close() 7364fee23f9Smrg { 7374fee23f9Smrg if (!_M_filebuf.close()) 7384fee23f9Smrg this->setstate(ios_base::failbit); 7394fee23f9Smrg } 7404fee23f9Smrg }; 7414fee23f9Smrg 7424fee23f9Smrg 7434fee23f9Smrg // [27.8.1.8] Template class basic_ofstream 7444fee23f9Smrg /** 7454fee23f9Smrg * @brief Controlling output for files. 7464fee23f9Smrg * @ingroup io 7474fee23f9Smrg * 74848fb7bfaSmrg * @tparam _CharT Type of character stream. 74948fb7bfaSmrg * @tparam _Traits Traits for character type, defaults to 75048fb7bfaSmrg * char_traits<_CharT>. 75148fb7bfaSmrg * 7524fee23f9Smrg * This class supports reading from named files, using the inherited 7534fee23f9Smrg * functions from std::basic_ostream. To control the associated 7544fee23f9Smrg * sequence, an instance of std::basic_filebuf is used, which this page 7554fee23f9Smrg * refers to as @c sb. 7564fee23f9Smrg */ 7574fee23f9Smrg template<typename _CharT, typename _Traits> 7584fee23f9Smrg class basic_ofstream : public basic_ostream<_CharT,_Traits> 7594fee23f9Smrg { 7604fee23f9Smrg public: 7614fee23f9Smrg // Types: 7624fee23f9Smrg typedef _CharT char_type; 7634fee23f9Smrg typedef _Traits traits_type; 7644fee23f9Smrg typedef typename traits_type::int_type int_type; 7654fee23f9Smrg typedef typename traits_type::pos_type pos_type; 7664fee23f9Smrg typedef typename traits_type::off_type off_type; 7674fee23f9Smrg 7684fee23f9Smrg // Non-standard types: 7694fee23f9Smrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 7704fee23f9Smrg typedef basic_ostream<char_type, traits_type> __ostream_type; 7714fee23f9Smrg 7724fee23f9Smrg private: 7734fee23f9Smrg __filebuf_type _M_filebuf; 7744fee23f9Smrg 7754fee23f9Smrg public: 7764fee23f9Smrg // Constructors: 7774fee23f9Smrg /** 7784fee23f9Smrg * @brief Default constructor. 7794fee23f9Smrg * 7804fee23f9Smrg * Initializes @c sb using its default constructor, and passes 7814fee23f9Smrg * @c &sb to the base class initializer. Does not open any files 7824fee23f9Smrg * (you haven't given it a filename to open). 7834fee23f9Smrg */ 7844fee23f9Smrg basic_ofstream(): __ostream_type(), _M_filebuf() 7854fee23f9Smrg { this->init(&_M_filebuf); } 7864fee23f9Smrg 7874fee23f9Smrg /** 7884fee23f9Smrg * @brief Create an output file stream. 78948fb7bfaSmrg * @param __s Null terminated string specifying the filename. 79048fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 7914fee23f9Smrg * 792a3e9eb18Smrg * @c ios_base::out is automatically included in @a __mode. 7934fee23f9Smrg */ 7944fee23f9Smrg explicit 7954fee23f9Smrg basic_ofstream(const char* __s, 796a3e9eb18Smrg ios_base::openmode __mode = ios_base::out) 7974fee23f9Smrg : __ostream_type(), _M_filebuf() 7984fee23f9Smrg { 7994fee23f9Smrg this->init(&_M_filebuf); 8004fee23f9Smrg this->open(__s, __mode); 8014fee23f9Smrg } 8024fee23f9Smrg 803181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 804181254a7Smrg /** 805181254a7Smrg * @param Create an output file stream. 806181254a7Smrg * @param __s Wide string specifying the filename. 807181254a7Smrg * @param __mode Open file in specified mode (see std::ios_base). 808181254a7Smrg * 809181254a7Smrg * @c ios_base::out | @c ios_base::trunc is automatically included in 810181254a7Smrg * @a __mode. 811181254a7Smrg */ 812181254a7Smrg basic_ofstream(const wchar_t* __s, 813181254a7Smrg ios_base::openmode __mode = ios_base::out|ios_base::trunc) 814181254a7Smrg : __ostream_type(), _M_filebuf() 815181254a7Smrg { 816181254a7Smrg this->init(&_M_filebuf); 817181254a7Smrg this->open(__s, __mode); 818181254a7Smrg } 819181254a7Smrg#endif 820181254a7Smrg 82148fb7bfaSmrg#if __cplusplus >= 201103L 8224fee23f9Smrg /** 8234fee23f9Smrg * @brief Create an output file stream. 82448fb7bfaSmrg * @param __s std::string specifying the filename. 82548fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 8264fee23f9Smrg * 827a3e9eb18Smrg * @c ios_base::out is automatically included in @a __mode. 8284fee23f9Smrg */ 8294fee23f9Smrg explicit 8304fee23f9Smrg basic_ofstream(const std::string& __s, 831a3e9eb18Smrg ios_base::openmode __mode = ios_base::out) 8324fee23f9Smrg : __ostream_type(), _M_filebuf() 8334fee23f9Smrg { 8344fee23f9Smrg this->init(&_M_filebuf); 8354fee23f9Smrg this->open(__s, __mode); 8364fee23f9Smrg } 8374d5abbe8Smrg 838a3e9eb18Smrg#if __cplusplus >= 201703L 839a3e9eb18Smrg /** 840fb8a8121Smrg * @brief Create an output file stream. 841a3e9eb18Smrg * @param __s filesystem::path specifying the filename. 842a3e9eb18Smrg * @param __mode Open file in specified mode (see std::ios_base). 843a3e9eb18Smrg * 844a3e9eb18Smrg * @c ios_base::out is automatically included in @a __mode. 845a3e9eb18Smrg */ 846a3e9eb18Smrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 847a3e9eb18Smrg basic_ofstream(const _Path& __s, 848a3e9eb18Smrg ios_base::openmode __mode = ios_base::out) 849a3e9eb18Smrg : basic_ofstream(__s.c_str(), __mode) 850a3e9eb18Smrg { } 851a3e9eb18Smrg#endif // C++17 852a3e9eb18Smrg 8534d5abbe8Smrg basic_ofstream(const basic_ofstream&) = delete; 8544d5abbe8Smrg 8554d5abbe8Smrg basic_ofstream(basic_ofstream&& __rhs) 8564d5abbe8Smrg : __ostream_type(std::move(__rhs)), 8574d5abbe8Smrg _M_filebuf(std::move(__rhs._M_filebuf)) 8584d5abbe8Smrg { __ostream_type::set_rdbuf(&_M_filebuf); } 8594fee23f9Smrg#endif 8604fee23f9Smrg 8614fee23f9Smrg /** 8624fee23f9Smrg * @brief The destructor does nothing. 8634fee23f9Smrg * 8644fee23f9Smrg * The file is closed by the filebuf object, not the formatting 8654fee23f9Smrg * stream. 8664fee23f9Smrg */ 8674fee23f9Smrg ~basic_ofstream() 8684fee23f9Smrg { } 8694fee23f9Smrg 8704d5abbe8Smrg#if __cplusplus >= 201103L 8714d5abbe8Smrg // 27.8.3.2 Assign and swap: 8724d5abbe8Smrg 8734d5abbe8Smrg basic_ofstream& 8744d5abbe8Smrg operator=(const basic_ofstream&) = delete; 8754d5abbe8Smrg 8764d5abbe8Smrg basic_ofstream& 8774d5abbe8Smrg operator=(basic_ofstream&& __rhs) 8784d5abbe8Smrg { 8794d5abbe8Smrg __ostream_type::operator=(std::move(__rhs)); 8804d5abbe8Smrg _M_filebuf = std::move(__rhs._M_filebuf); 8814d5abbe8Smrg return *this; 8824d5abbe8Smrg } 8834d5abbe8Smrg 8844d5abbe8Smrg void 8854d5abbe8Smrg swap(basic_ofstream& __rhs) 8864d5abbe8Smrg { 8874d5abbe8Smrg __ostream_type::swap(__rhs); 8884d5abbe8Smrg _M_filebuf.swap(__rhs._M_filebuf); 8894d5abbe8Smrg } 8904d5abbe8Smrg#endif 8914d5abbe8Smrg 8924fee23f9Smrg // Members: 8934fee23f9Smrg /** 8944fee23f9Smrg * @brief Accessing the underlying buffer. 8954fee23f9Smrg * @return The current basic_filebuf buffer. 8964fee23f9Smrg * 8974fee23f9Smrg * This hides both signatures of std::basic_ios::rdbuf(). 8984fee23f9Smrg */ 8994fee23f9Smrg __filebuf_type* 9004fee23f9Smrg rdbuf() const 9014fee23f9Smrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 9024fee23f9Smrg 9034fee23f9Smrg /** 9044fee23f9Smrg * @brief Wrapper to test for an open file. 9054fee23f9Smrg * @return @c rdbuf()->is_open() 9064fee23f9Smrg */ 9074fee23f9Smrg bool 9084fee23f9Smrg is_open() 9094fee23f9Smrg { return _M_filebuf.is_open(); } 9104fee23f9Smrg 9114fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9124fee23f9Smrg // 365. Lack of const-qualification in clause 27 9134fee23f9Smrg bool 9144fee23f9Smrg is_open() const 9154fee23f9Smrg { return _M_filebuf.is_open(); } 9164fee23f9Smrg 9174fee23f9Smrg /** 9184fee23f9Smrg * @brief Opens an external file. 91948fb7bfaSmrg * @param __s The name of the file. 92048fb7bfaSmrg * @param __mode The open mode flags. 9214fee23f9Smrg * 922a3e9eb18Smrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 9234fee23f9Smrg * function fails, @c failbit is set in the stream's error state. 9244fee23f9Smrg */ 9254fee23f9Smrg void 926a3e9eb18Smrg open(const char* __s, ios_base::openmode __mode = ios_base::out) 9274fee23f9Smrg { 9284fee23f9Smrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 9294fee23f9Smrg this->setstate(ios_base::failbit); 9304fee23f9Smrg else 9314fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9324fee23f9Smrg // 409. Closing an fstream should clear error state 9334fee23f9Smrg this->clear(); 9344fee23f9Smrg } 9354fee23f9Smrg 936181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 937181254a7Smrg /** 938181254a7Smrg * @brief Opens an external file. 939181254a7Smrg * @param __s The name of the file. 940181254a7Smrg * @param __mode The open mode flags. 941181254a7Smrg * 942181254a7Smrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 943181254a7Smrg * function fails, @c failbit is set in the stream's error state. 944181254a7Smrg */ 945181254a7Smrg void 946181254a7Smrg open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out) 947181254a7Smrg { 948181254a7Smrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 949181254a7Smrg this->setstate(ios_base::failbit); 950181254a7Smrg else 951181254a7Smrg this->clear(); 952181254a7Smrg } 953181254a7Smrg#endif 954181254a7Smrg 95548fb7bfaSmrg#if __cplusplus >= 201103L 9564fee23f9Smrg /** 9574fee23f9Smrg * @brief Opens an external file. 95848fb7bfaSmrg * @param __s The name of the file. 95948fb7bfaSmrg * @param __mode The open mode flags. 9604fee23f9Smrg * 961a3e9eb18Smrg * Calls @c std::basic_filebuf::open(s,mode|out). If that 9624fee23f9Smrg * function fails, @c failbit is set in the stream's error state. 9634fee23f9Smrg */ 9644fee23f9Smrg void 965a3e9eb18Smrg open(const std::string& __s, ios_base::openmode __mode = ios_base::out) 9664fee23f9Smrg { 9674fee23f9Smrg if (!_M_filebuf.open(__s, __mode | ios_base::out)) 9684fee23f9Smrg this->setstate(ios_base::failbit); 9694fee23f9Smrg else 9704fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 9714fee23f9Smrg // 409. Closing an fstream should clear error state 9724fee23f9Smrg this->clear(); 9734fee23f9Smrg } 974a3e9eb18Smrg 975a3e9eb18Smrg#if __cplusplus >= 201703L 976a3e9eb18Smrg /** 977a3e9eb18Smrg * @brief Opens an external file. 978a3e9eb18Smrg * @param __s The name of the file, as a filesystem::path. 979a3e9eb18Smrg * @param __mode The open mode flags. 980a3e9eb18Smrg * 981a3e9eb18Smrg * Calls @c std::basic_filebuf::open(__s,__mode|out). If that 982a3e9eb18Smrg * function fails, @c failbit is set in the stream's error state. 983a3e9eb18Smrg */ 984a3e9eb18Smrg template<typename _Path> 985a3e9eb18Smrg _If_fs_path<_Path, void> 986a3e9eb18Smrg open(const _Path& __s, ios_base::openmode __mode = ios_base::out) 987a3e9eb18Smrg { open(__s.c_str(), __mode); } 988a3e9eb18Smrg#endif // C++17 989a3e9eb18Smrg#endif // C++11 9904fee23f9Smrg 9914fee23f9Smrg /** 9924fee23f9Smrg * @brief Close the file. 9934fee23f9Smrg * 9944fee23f9Smrg * Calls @c std::basic_filebuf::close(). If that function 9954fee23f9Smrg * fails, @c failbit is set in the stream's error state. 9964fee23f9Smrg */ 9974fee23f9Smrg void 9984fee23f9Smrg close() 9994fee23f9Smrg { 10004fee23f9Smrg if (!_M_filebuf.close()) 10014fee23f9Smrg this->setstate(ios_base::failbit); 10024fee23f9Smrg } 10034fee23f9Smrg }; 10044fee23f9Smrg 10054fee23f9Smrg 10064fee23f9Smrg // [27.8.1.11] Template class basic_fstream 10074fee23f9Smrg /** 10084fee23f9Smrg * @brief Controlling input and output for files. 10094fee23f9Smrg * @ingroup io 10104fee23f9Smrg * 101148fb7bfaSmrg * @tparam _CharT Type of character stream. 101248fb7bfaSmrg * @tparam _Traits Traits for character type, defaults to 101348fb7bfaSmrg * char_traits<_CharT>. 101448fb7bfaSmrg * 10154fee23f9Smrg * This class supports reading from and writing to named files, using 10164fee23f9Smrg * the inherited functions from std::basic_iostream. To control the 10174fee23f9Smrg * associated sequence, an instance of std::basic_filebuf is used, which 10184fee23f9Smrg * this page refers to as @c sb. 10194fee23f9Smrg */ 10204fee23f9Smrg template<typename _CharT, typename _Traits> 10214fee23f9Smrg class basic_fstream : public basic_iostream<_CharT, _Traits> 10224fee23f9Smrg { 10234fee23f9Smrg public: 10244fee23f9Smrg // Types: 10254fee23f9Smrg typedef _CharT char_type; 10264fee23f9Smrg typedef _Traits traits_type; 10274fee23f9Smrg typedef typename traits_type::int_type int_type; 10284fee23f9Smrg typedef typename traits_type::pos_type pos_type; 10294fee23f9Smrg typedef typename traits_type::off_type off_type; 10304fee23f9Smrg 10314fee23f9Smrg // Non-standard types: 10324fee23f9Smrg typedef basic_filebuf<char_type, traits_type> __filebuf_type; 10334fee23f9Smrg typedef basic_ios<char_type, traits_type> __ios_type; 10344fee23f9Smrg typedef basic_iostream<char_type, traits_type> __iostream_type; 10354fee23f9Smrg 10364fee23f9Smrg private: 10374fee23f9Smrg __filebuf_type _M_filebuf; 10384fee23f9Smrg 10394fee23f9Smrg public: 10404fee23f9Smrg // Constructors/destructor: 10414fee23f9Smrg /** 10424fee23f9Smrg * @brief Default constructor. 10434fee23f9Smrg * 10444fee23f9Smrg * Initializes @c sb using its default constructor, and passes 10454fee23f9Smrg * @c &sb to the base class initializer. Does not open any files 10464fee23f9Smrg * (you haven't given it a filename to open). 10474fee23f9Smrg */ 10484fee23f9Smrg basic_fstream() 10494fee23f9Smrg : __iostream_type(), _M_filebuf() 10504fee23f9Smrg { this->init(&_M_filebuf); } 10514fee23f9Smrg 10524fee23f9Smrg /** 10534fee23f9Smrg * @brief Create an input/output file stream. 105448fb7bfaSmrg * @param __s Null terminated string specifying the filename. 105548fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 10564fee23f9Smrg */ 10574fee23f9Smrg explicit 10584fee23f9Smrg basic_fstream(const char* __s, 10594fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 106048fb7bfaSmrg : __iostream_type(0), _M_filebuf() 10614fee23f9Smrg { 10624fee23f9Smrg this->init(&_M_filebuf); 10634fee23f9Smrg this->open(__s, __mode); 10644fee23f9Smrg } 10654fee23f9Smrg 1066181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 1067181254a7Smrg /** 1068181254a7Smrg * @param Create an input/output file stream. 1069181254a7Smrg * @param __s Wide string specifying the filename. 1070181254a7Smrg * @param __mode Open file in specified mode (see std::ios_base). 1071181254a7Smrg */ 1072181254a7Smrg basic_fstream(const wchar_t* __s, 1073181254a7Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1074181254a7Smrg : __iostream_type(0), _M_filebuf() 1075181254a7Smrg { 1076181254a7Smrg this->init(&_M_filebuf); 1077181254a7Smrg this->open(__s, __mode); 1078181254a7Smrg } 1079181254a7Smrg#endif 1080181254a7Smrg 108148fb7bfaSmrg#if __cplusplus >= 201103L 10824fee23f9Smrg /** 10834fee23f9Smrg * @brief Create an input/output file stream. 108448fb7bfaSmrg * @param __s Null terminated string specifying the filename. 108548fb7bfaSmrg * @param __mode Open file in specified mode (see std::ios_base). 10864fee23f9Smrg */ 10874fee23f9Smrg explicit 10884fee23f9Smrg basic_fstream(const std::string& __s, 10894fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 109048fb7bfaSmrg : __iostream_type(0), _M_filebuf() 10914fee23f9Smrg { 10924fee23f9Smrg this->init(&_M_filebuf); 10934fee23f9Smrg this->open(__s, __mode); 10944fee23f9Smrg } 10954d5abbe8Smrg 1096a3e9eb18Smrg#if __cplusplus >= 201703L 1097a3e9eb18Smrg /** 1098fb8a8121Smrg * @brief Create an input/output file stream. 1099a3e9eb18Smrg * @param __s filesystem::path specifying the filename. 1100a3e9eb18Smrg * @param __mode Open file in specified mode (see std::ios_base). 1101a3e9eb18Smrg */ 1102a3e9eb18Smrg template<typename _Path, typename _Require = _If_fs_path<_Path>> 1103a3e9eb18Smrg basic_fstream(const _Path& __s, 1104a3e9eb18Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1105a3e9eb18Smrg : basic_fstream(__s.c_str(), __mode) 1106a3e9eb18Smrg { } 1107a3e9eb18Smrg#endif // C++17 1108a3e9eb18Smrg 11094d5abbe8Smrg basic_fstream(const basic_fstream&) = delete; 11104d5abbe8Smrg 11114d5abbe8Smrg basic_fstream(basic_fstream&& __rhs) 11124d5abbe8Smrg : __iostream_type(std::move(__rhs)), 11134d5abbe8Smrg _M_filebuf(std::move(__rhs._M_filebuf)) 11144d5abbe8Smrg { __iostream_type::set_rdbuf(&_M_filebuf); } 11154fee23f9Smrg#endif 11164fee23f9Smrg 11174fee23f9Smrg /** 11184fee23f9Smrg * @brief The destructor does nothing. 11194fee23f9Smrg * 11204fee23f9Smrg * The file is closed by the filebuf object, not the formatting 11214fee23f9Smrg * stream. 11224fee23f9Smrg */ 11234fee23f9Smrg ~basic_fstream() 11244fee23f9Smrg { } 11254fee23f9Smrg 11264d5abbe8Smrg#if __cplusplus >= 201103L 11274d5abbe8Smrg // 27.8.3.2 Assign and swap: 11284d5abbe8Smrg 11294d5abbe8Smrg basic_fstream& 11304d5abbe8Smrg operator=(const basic_fstream&) = delete; 11314d5abbe8Smrg 11324d5abbe8Smrg basic_fstream& 11334d5abbe8Smrg operator=(basic_fstream&& __rhs) 11344d5abbe8Smrg { 11354d5abbe8Smrg __iostream_type::operator=(std::move(__rhs)); 11364d5abbe8Smrg _M_filebuf = std::move(__rhs._M_filebuf); 11374d5abbe8Smrg return *this; 11384d5abbe8Smrg } 11394d5abbe8Smrg 11404d5abbe8Smrg void 11414d5abbe8Smrg swap(basic_fstream& __rhs) 11424d5abbe8Smrg { 11434d5abbe8Smrg __iostream_type::swap(__rhs); 11444d5abbe8Smrg _M_filebuf.swap(__rhs._M_filebuf); 11454d5abbe8Smrg } 11464d5abbe8Smrg#endif 11474d5abbe8Smrg 11484fee23f9Smrg // Members: 11494fee23f9Smrg /** 11504fee23f9Smrg * @brief Accessing the underlying buffer. 11514fee23f9Smrg * @return The current basic_filebuf buffer. 11524fee23f9Smrg * 11534fee23f9Smrg * This hides both signatures of std::basic_ios::rdbuf(). 11544fee23f9Smrg */ 11554fee23f9Smrg __filebuf_type* 11564fee23f9Smrg rdbuf() const 11574fee23f9Smrg { return const_cast<__filebuf_type*>(&_M_filebuf); } 11584fee23f9Smrg 11594fee23f9Smrg /** 11604fee23f9Smrg * @brief Wrapper to test for an open file. 11614fee23f9Smrg * @return @c rdbuf()->is_open() 11624fee23f9Smrg */ 11634fee23f9Smrg bool 11644fee23f9Smrg is_open() 11654fee23f9Smrg { return _M_filebuf.is_open(); } 11664fee23f9Smrg 11674fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 11684fee23f9Smrg // 365. Lack of const-qualification in clause 27 11694fee23f9Smrg bool 11704fee23f9Smrg is_open() const 11714fee23f9Smrg { return _M_filebuf.is_open(); } 11724fee23f9Smrg 11734fee23f9Smrg /** 11744fee23f9Smrg * @brief Opens an external file. 117548fb7bfaSmrg * @param __s The name of the file. 117648fb7bfaSmrg * @param __mode The open mode flags. 11774fee23f9Smrg * 117848fb7bfaSmrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 11794fee23f9Smrg * function fails, @c failbit is set in the stream's error state. 11804fee23f9Smrg */ 11814fee23f9Smrg void 11824fee23f9Smrg open(const char* __s, 11834fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 11844fee23f9Smrg { 11854fee23f9Smrg if (!_M_filebuf.open(__s, __mode)) 11864fee23f9Smrg this->setstate(ios_base::failbit); 11874fee23f9Smrg else 11884fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 11894fee23f9Smrg // 409. Closing an fstream should clear error state 11904fee23f9Smrg this->clear(); 11914fee23f9Smrg } 11924fee23f9Smrg 1193181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T 1194181254a7Smrg /** 1195181254a7Smrg * @brief Opens an external file. 1196181254a7Smrg * @param __s The name of the file. 1197181254a7Smrg * @param __mode The open mode flags. 1198181254a7Smrg * 1199181254a7Smrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 1200181254a7Smrg * function fails, @c failbit is set in the stream's error state. 1201181254a7Smrg */ 1202181254a7Smrg void 1203181254a7Smrg open(const wchar_t* __s, 1204181254a7Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1205181254a7Smrg { 1206181254a7Smrg if (!_M_filebuf.open(__s, __mode)) 1207181254a7Smrg this->setstate(ios_base::failbit); 1208181254a7Smrg else 1209181254a7Smrg this->clear(); 1210181254a7Smrg } 1211181254a7Smrg#endif 1212181254a7Smrg 121348fb7bfaSmrg#if __cplusplus >= 201103L 12144fee23f9Smrg /** 12154fee23f9Smrg * @brief Opens an external file. 121648fb7bfaSmrg * @param __s The name of the file. 121748fb7bfaSmrg * @param __mode The open mode flags. 12184fee23f9Smrg * 121948fb7bfaSmrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 12204fee23f9Smrg * function fails, @c failbit is set in the stream's error state. 12214fee23f9Smrg */ 12224fee23f9Smrg void 12234fee23f9Smrg open(const std::string& __s, 12244fee23f9Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 12254fee23f9Smrg { 12264fee23f9Smrg if (!_M_filebuf.open(__s, __mode)) 12274fee23f9Smrg this->setstate(ios_base::failbit); 12284fee23f9Smrg else 12294fee23f9Smrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 12304fee23f9Smrg // 409. Closing an fstream should clear error state 12314fee23f9Smrg this->clear(); 12324fee23f9Smrg } 1233a3e9eb18Smrg 1234a3e9eb18Smrg#if __cplusplus >= 201703L 1235a3e9eb18Smrg /** 1236a3e9eb18Smrg * @brief Opens an external file. 1237a3e9eb18Smrg * @param __s The name of the file, as a filesystem::path. 1238a3e9eb18Smrg * @param __mode The open mode flags. 1239a3e9eb18Smrg * 1240a3e9eb18Smrg * Calls @c std::basic_filebuf::open(__s,__mode). If that 1241a3e9eb18Smrg * function fails, @c failbit is set in the stream's error state. 1242a3e9eb18Smrg */ 1243a3e9eb18Smrg template<typename _Path> 1244a3e9eb18Smrg _If_fs_path<_Path, void> 1245a3e9eb18Smrg open(const _Path& __s, 1246a3e9eb18Smrg ios_base::openmode __mode = ios_base::in | ios_base::out) 1247a3e9eb18Smrg { open(__s.c_str(), __mode); } 1248a3e9eb18Smrg#endif // C++17 1249a3e9eb18Smrg#endif // C++11 12504fee23f9Smrg 12514fee23f9Smrg /** 12524fee23f9Smrg * @brief Close the file. 12534fee23f9Smrg * 12544fee23f9Smrg * Calls @c std::basic_filebuf::close(). If that function 12554fee23f9Smrg * fails, @c failbit is set in the stream's error state. 12564fee23f9Smrg */ 12574fee23f9Smrg void 12584fee23f9Smrg close() 12594fee23f9Smrg { 12604fee23f9Smrg if (!_M_filebuf.close()) 12614fee23f9Smrg this->setstate(ios_base::failbit); 12624fee23f9Smrg } 12634fee23f9Smrg }; 12644fee23f9Smrg 12654d5abbe8Smrg#if __cplusplus >= 201103L 12664d5abbe8Smrg /// Swap specialization for filebufs. 12674d5abbe8Smrg template <class _CharT, class _Traits> 12684d5abbe8Smrg inline void 12694d5abbe8Smrg swap(basic_filebuf<_CharT, _Traits>& __x, 12704d5abbe8Smrg basic_filebuf<_CharT, _Traits>& __y) 12714d5abbe8Smrg { __x.swap(__y); } 12724d5abbe8Smrg 12734d5abbe8Smrg /// Swap specialization for ifstreams. 12744d5abbe8Smrg template <class _CharT, class _Traits> 12754d5abbe8Smrg inline void 12764d5abbe8Smrg swap(basic_ifstream<_CharT, _Traits>& __x, 12774d5abbe8Smrg basic_ifstream<_CharT, _Traits>& __y) 12784d5abbe8Smrg { __x.swap(__y); } 12794d5abbe8Smrg 12804d5abbe8Smrg /// Swap specialization for ofstreams. 12814d5abbe8Smrg template <class _CharT, class _Traits> 12824d5abbe8Smrg inline void 12834d5abbe8Smrg swap(basic_ofstream<_CharT, _Traits>& __x, 12844d5abbe8Smrg basic_ofstream<_CharT, _Traits>& __y) 12854d5abbe8Smrg { __x.swap(__y); } 12864d5abbe8Smrg 12874d5abbe8Smrg /// Swap specialization for fstreams. 12884d5abbe8Smrg template <class _CharT, class _Traits> 12894d5abbe8Smrg inline void 12904d5abbe8Smrg swap(basic_fstream<_CharT, _Traits>& __x, 12914d5abbe8Smrg basic_fstream<_CharT, _Traits>& __y) 12924d5abbe8Smrg { __x.swap(__y); } 12934d5abbe8Smrg#endif 12944d5abbe8Smrg 129548fb7bfaSmrg_GLIBCXX_END_NAMESPACE_VERSION 129648fb7bfaSmrg} // namespace 12974fee23f9Smrg 12984fee23f9Smrg#include <bits/fstream.tcc> 12994fee23f9Smrg 13004fee23f9Smrg#endif /* _GLIBCXX_FSTREAM */ 1301