📄 fstream
字号:
}
else
_Str.erase((size_t)0, // partial, discard used input
(size_t)(_Src - &*_Str.begin()));
break;
case codecvt_base::noconv:
if (_Str.size() < sizeof (_Elem))
break; // no conversion, but need more chars
_CRT_SECURE_MEMCPY(&_Ch, sizeof (_Elem), &*_Str.begin(),
sizeof (_Elem)); // copy raw bytes to element
return (_Traits::to_int_type(_Ch)); // return result
default:
return (_Traits::eof()); // conversion failed
}
}
}
}
virtual pos_type __CLR_OR_THIS_CALL seekoff(off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode =
(ios_base::openmode)(ios_base::in | ios_base::out))
{ // change position by _Off
fpos_t _Fileposition;
if (_Mysb::gptr() == &_Mychar // something putback
&& _Way == ios_base::cur // a relative seek
&& _Pcvt == 0) // not converting
_Off -= (off_type)sizeof (_Elem); // back up over _Elem bytes
if (_Myfile == 0 || !_Endwrite()
|| (_Off != 0 || _Way != ios_base::cur)
&& _FSEEK_OFF(_Myfile, _Off, _Way) != 0
|| fgetpos(_Myfile, &_Fileposition) != 0)
return (pos_type(_BADOFF)); // report failure
_Reset_back(); // revert from _Mychar buffer, discarding any putback
return (_POS_TYPE_FROM_STATE(pos_type, _State,
_Fileposition)); // return new position
}
virtual pos_type __CLR_OR_THIS_CALL seekpos(pos_type _Pos,
ios_base::openmode =
(ios_base::openmode)(ios_base::in | ios_base::out))
{ // change position to _Pos
fpos_t _Fileposition = _POS_TYPE_TO_FPOS_T(_Pos);
off_type _Off = (off_type)_Pos - (off_type)_FPOSOFF(_Fileposition);
if (_Myfile == 0 || !_Endwrite()
|| fsetpos(_Myfile, &_Fileposition) != 0
|| _Off != 0 && _FSEEK_OFF(_Myfile, _Off, SEEK_CUR) != 0
|| fgetpos(_Myfile, &_Fileposition) != 0)
return (pos_type(_BADOFF)); // report failure
_State = _POS_TYPE_TO_STATE(_Pos);
_Reset_back(); // revert from _Mychar buffer, discarding any putback
return (_POS_TYPE_FROM_STATE(pos_type, _State,
_Fileposition)); // return new position
}
virtual _Mysb *__CLR_OR_THIS_CALL setbuf(_Elem *_Buffer, streamsize _Count)
{ // offer _Buffer to C stream
if (_Myfile == 0 || setvbuf(_Myfile, (char *)_Buffer,
_Buffer == 0 && _Count == 0 ? _IONBF : _IOFBF,
(size_t)_Count * sizeof (_Elem)) != 0)
return (0); // failed
else
{ // new buffer, reinitialize pointers
_Init(_Myfile, _Openfl);
return (this);
}
}
virtual int __CLR_OR_THIS_CALL sync()
{ // synchronize C stream with external file
return (_Myfile == 0
|| _Traits::eq_int_type(_Traits::eof(), overflow())
|| 0 <= fflush(_Myfile) ? 0 : -1);
}
virtual void __CLR_OR_THIS_CALL imbue(const locale& _Loc)
{ // set locale to argument (capture nontrivial codecvt facet)
_Initcvt(&_USE(_Loc, _Cvt));
}
void _Init(_Filet *_File, _Initfl _Which)
{ // initialize to C stream _File after {new, open, close}
__PURE_APPDOMAIN_GLOBAL static _Myst _Stinit; // initial state
_Closef = _Which == _Openfl;
_Wrotesome = false;
_Mysb::_Init(); // initialize stream buffer base object
#ifndef _IORCNT
#define _IORCNT _IOCNT /* read and write counts are the same */
#define _IOWCNT _IOCNT
#endif /* _IORCNT */
#pragma warning(push)
#pragma warning(disable: 6240) /* prefast noise VSW 489858 */
if (_File != 0 && sizeof (_Elem) == 1)
#pragma warning(pop)
{ // point inside C stream with [first, first + count) buffer
_Elem **_Pb = (_Elem **)&_File->_IOBASE;
_Elem **_Pn = (_Elem **)&_File->_IOPTR;
int *_Nr = (int *)&_File->_IORCNT;
int *_Nw = (int *)&_File->_IOWCNT;
_Mysb::_Init(_Pb, _Pn, _Nr, _Pb, _Pn, _Nw);
}
_Myfile = _File;
_State = _Stinit;
_Pcvt = 0; // pointer to codecvt facet
}
bool _Endwrite()
{ // put shift to initial conversion state, as needed
if (_Pcvt == 0 || !_Wrotesome)
return (true);
else
{ // may have to put
const int _STRING_INC = 8;
char *_Dest;
if (_Traits::eq_int_type(_Traits::eof(), overflow()))
return (false);
string _Str(_STRING_INC, '\0');
for (; ; )
switch (_Pcvt->unshift(_State,
&*_Str.begin(), &*_Str.begin() + _Str.size(), _Dest))
{ // test result of homing conversion
case codecvt_base::ok:
_Wrotesome = false; // homed successfully
case codecvt_base::partial: // fall through
{ // put any generated bytes
size_t _Count = _Dest - &*_Str.begin();
if (0 < _Count && _Count !=
fwrite(&*_Str.begin(), 1, _Count, _Myfile))
return (false); // write failed
if (!_Wrotesome)
return (true);
if (_Count == 0)
_Str.append(_STRING_INC, '\0'); // try with more space
break;
}
case codecvt_base::noconv:
return (true); // nothing to do
default:
return (false); // conversion failed
}
}
}
void _Initcvt(const _Cvt *_Newpcvt)
{ // initialize codecvt pointer
if (_Newpcvt->always_noconv())
_Pcvt = 0; // nothing to do
else
{ // set up for nontrivial codecvt facet
_Pcvt = _Newpcvt;
_Mysb::_Init(); // reset any buffering
}
}
private:
void _Reset_back()
{ // restore buffer after putback
if (_Mysb::eback() == &_Mychar)
_Mysb::setg(_Set_eback, _Set_egptr, _Set_egptr);
}
void _Set_back()
{ // set up putback area
if (_Mysb::eback() != &_Mychar)
{ // save current get buffer
_Set_eback = _Mysb::eback();
_Set_egptr = _Mysb::egptr();
}
_Mysb::setg(&_Mychar, &_Mychar, &_Mychar + 1);
}
_Elem *_Set_eback; // saves eback() during one-element putback
_Elem *_Set_egptr; // saves egptr()
const _Cvt *_Pcvt; // pointer to codecvt facet (may be null)
_Elem _Mychar; // putback character, when _Ungetc fails
bool _Wrotesome; // true if homing sequence may be needed
typename _Traits::state_type _State; // current conversion state
bool _Closef; // true if C stream must be closed
_Filet *_Myfile; // pointer to C stream
};
// basic_filebuf TEMPLATE OPERATORS
template<class _Elem,
class _Traits> inline
void swap(basic_filebuf<_Elem, _Traits>& _Left,
basic_filebuf<_Elem, _Traits>& _Right)
{ // swap _Left and _Right basic_filebufs
_Left.swap(_Right);
}
template<class _Elem,
class _Traits> inline
void swap(basic_filebuf<_Elem, _Traits>& _Left,
basic_filebuf<_Elem, _Traits>&& _Right)
{ // swap _Left and _Right basic_filebufs
typedef basic_filebuf<_Elem, _Traits> _Myt;
_Left.swap(_STD forward<_Myt>(_Right));
}
template<class _Elem,
class _Traits> inline
void swap(basic_filebuf<_Elem, _Traits>&& _Left,
basic_filebuf<_Elem, _Traits>& _Right)
{ // swap _Left and _Right basic_filebuf
typedef basic_filebuf<_Elem, _Traits> _Myt;
_Right.swap(_STD forward<_Myt>(_Left));
}
// TEMPLATE CLASS basic_ifstream
template<class _Elem,
class _Traits>
class basic_ifstream
: public basic_istream<_Elem, _Traits>
{ // input stream associated with a C stream
public:
typedef basic_ifstream<_Elem, _Traits> _Myt;
typedef basic_istream<_Elem, _Traits> _Mybase;
typedef basic_filebuf<_Elem, _Traits> _Myfb;
typedef basic_ios<_Elem, _Traits> _Myios;
basic_ifstream()
: _Mybase(&_Filebuffer)
{ // construct unopened
}
explicit basic_ifstream(const char *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
: _Mybase(&_Filebuffer)
{ // construct with named file and specified mode
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
}
#if _HAS_CPP0X
explicit basic_ifstream(const string& _Str,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
: _Mybase(&_Filebuffer)
{ // construct with named file and specified mode
if (_Filebuffer.open(_Str.c_str(), _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
}
#endif /* _HAS_CPP0X */
explicit basic_ifstream(const wchar_t *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
: _Mybase(&_Filebuffer)
{ // construct with wide-named file -- EXTENSION
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
}
#if _HAS_CPP0X
explicit basic_ifstream(const wstring& _Str,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
: _Mybase(&_Filebuffer)
{ // construct with wide-named file -- EXTENSION
if (_Filebuffer.open(_Str.c_str(), _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
}
#endif /* _HAS_CPP0X */
#ifdef _NATIVE_WCHAR_T_DEFINED
explicit basic_ifstream(const unsigned short *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
: _Mybase(&_Filebuffer)
{ // construct with wide-named file -- EXTENSION
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
}
#endif /* _NATIVE_WCHAR_T_DEFINED */
explicit basic_ifstream(_Filet *_File)
: _Mybase(&_Filebuffer),
_Filebuffer(_File)
{ // construct with specified C stream
}
basic_ifstream(_Myt&& _Right)
: _Mybase(&_Filebuffer)
{ // construct by moving _Right
_Assign_rv(_STD forward<_Myt>(_Right));
}
_Myt& operator=(_Myt&& _Right)
{ // move from _Right
_Assign_rv(_STD forward<_Myt>(_Right));
return (*this);
}
void _Assign_rv(_Myt&& _Right)
{ // assign by moving _Right
if (this != &_Right)
{ // different, worth moving
_Filebuffer.close();
this->swap(_Right);
}
}
void swap(_Myt& _Right)
{ // swap with _Right
if (this != &_Right)
{ // different, swap base and buffer
_Mybase::swap(_Right);
_Filebuffer.swap(_Right._Filebuffer);
}
}
void swap(_Myt&& _Right)
{ // swap with _Right
_Assign_rv(_STD forward<_Myt>(_Right));
}
void open(const wchar_t *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
{ // open a wide-named C stream -- EXTENSION
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
else
_Myios::clear(); // added with C++0X
}
#if _HAS_CPP0X
void open(const wstring& _Str,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
{ // open a wide-named C stream -- EXTENSION
open(_Str.c_str(), _Mode, _Prot);
}
#endif /* _HAS_CPP0X */
void open(const wchar_t *_Filename, ios_base::open_mode _Mode)
{ // open wide-named file (old style) -- EXTENSION
open(_Filename, (ios_base::openmode)_Mode);
}
#ifdef _NATIVE_WCHAR_T_DEFINED
void open(const unsigned short *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
{ // open a wide-named C stream -- EXTENSION
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
else
_Myios::clear(); // added with C++0X
}
void open(const unsigned short *_Filename,
ios_base::open_mode _Mode)
{ // open wide-named file (old style) -- EXTENSION
open(_Filename, (ios_base::openmode)_Mode);
}
#endif /* _NATIVE_WCHAR_T_DEFINED */
virtual __CLR_OR_THIS_CALL ~basic_ifstream()
{ // destroy the object
}
_Myfb *rdbuf() const
{ // return pointer to file buffer
return ((_Myfb *)&_Filebuffer);
}
bool is_open() const
{ // test if C stream has been opened
return (_Filebuffer.is_open());
}
void open(const char *_Filename,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
{ // open a C stream with specified mode
if (_Filebuffer.open(_Filename, _Mode | ios_base::in, _Prot) == 0)
_Myios::setstate(ios_base::failbit);
else
_Myios::clear(); // added with C++0X
}
#if _HAS_CPP0X
void open(const string& _Str,
ios_base::openmode _Mode = ios_base::in,
int _Prot = (int)ios_base::_Openprot)
{ // open a C stream with specified mode
open(_Str.c_str(), _Mode, _Prot);
}
#endif /* _HAS_CPP0X */
void open(const char *_Filename, ios_base::open_mode _Mode)
{ // open named file with specified mode (old style)
open(_Filename, (ios_base::openmode)_Mode);
}
void close()
{ // close the C stream
if (_Filebuffer.close() == 0)
_Myios::setstate(ios_base::failbit);
}
private:
_Myfb _Filebuffer; // the file buffer
};
// basic_ifstream TEMPLATE OPERATORS
template<class _Elem,
class _Traits> inline
void swap(basic_ifstream<_Elem, _Traits>& _Left,
basic_ifstream<_Elem, _Traits>& _Right)
{ // swap _Left and _Right basic_ifstreams
_Left.swap(_Right);
}
template<class _Elem,
class _Traits> inline
void swap(basic_ifstream<_Elem, _Traits>& _Left,
basic_ifstream<_Elem, _Traits>&& _Right)
{ // swap _Left and _Right basic_ifstreams
typedef basic_ifstream<_Elem, _Traits> _Myt;
_Left.swap(_STD forward<_Myt>(_Right));
}
template<class _Elem,
class _Traits> inline
void swap(basic_ifstream<_Elem, _Traits>&& _Left,
basic_ifstream<_Elem, _Traits>& _Right)
{ // swap _Left and _Right basic_ifstreams
typedef basic_ifstream<_Elem, _Traits> _Myt;
_Right.swap(_STD forward<_Myt>(_Left));
}
// TEMPLATE CLASS basic_ofstream
template<class _Elem,
class _Traits>
class basic_ofstream
: public basic_ostream<_Elem, _Traits>
{ // output stream associated with a C stream
public:
typedef basic_ofstream<_Elem, _Traits> _Myt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -