basic_filebuf<_CharT, _Traits>* basic_filebuf<_CharT, _Traits>::close() { bool __ok = this->is_open(); if (_M_in_output_mode) { __ok = __ok && !_Traits::eq_int_type(this->overflow(traits_type::eof()), traits_type::eof()); __ok = __ok && this->_M_unshift(); } else if (_M_in_input_mode) this->_M_exit_input_mode(); // Note order of arguments. We close the file even if __ok is false. __ok = _M_base._M_close() && __ok; // Restore the initial state, except that we don't deallocate the buffer // or mess with the cached codecvt information. _M_state = _M_end_state = _State_type(); _M_ext_buf_converted = _M_ext_buf_end = 0; _M_mmap_base = 0; _M_mmap_len = 0; this->setg(0, 0, 0); this->setp(0, 0); _M_saved_eback = _M_saved_gptr = _M_saved_egptr = 0; _M_in_input_mode = _M_in_output_mode = _M_in_error_mode = _M_in_putback_mode = false; return __ok ? this : 0; }
bool basic_filebuf<_CharT, _Traits>::_M_switch_to_output_mode() { if (this->is_open() && (_M_base.__o_mode() & (int)ios_base::out) && _M_in_input_mode == 0 && _M_in_error_mode == 0) { if (!_M_int_buf && !_M_allocate_buffers()) return false; // In append mode, every write does an implicit seek to the end // of the file. Whenever leaving output mode, the end of file // get put in the initial shift state. if (_M_base.__o_mode() & ios_base::app) _M_state = _State_type(); this->setp(_M_int_buf, _M_int_buf_EOS - 1); _M_in_output_mode = true; return true; } return false; }