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