namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_filebuf;
using filebuf = basic_filebuf<char>;
using wfilebuf = basic_filebuf<wchar_t>;
template<class charT, class traits = char_traits<charT>>
class basic_ifstream;
using ifstream = basic_ifstream<char>;
using wifstream = basic_ifstream<wchar_t>;
template<class charT, class traits = char_traits<charT>>
class basic_ofstream;
using ofstream = basic_ofstream<char>;
using wofstream = basic_ofstream<wchar_t>;
template<class charT, class traits = char_traits<charT>>
class basic_fstream;
using fstream = basic_fstream<char>;
using wfstream = basic_fstream<wchar_t>;
}
The header
<fstream>
defines four class templates and eight types
that associate stream buffers with files and assist
reading and writing files
.[
Note: The class template
basic_filebuf treats a file as a source or
sink of bytes
. In an environment that uses a large character set, the file
typically holds multibyte character sequences and the
basic_filebuf
object converts those multibyte sequences into wide character sequences
. —
end note ]
In subclause
[file.streams], member functions taking arguments of
const filesystem::path::value_type*
are only be provided on systems where
filesystem::path::value_type (
[fs.class.path]) is not
char. [
Note: These functions enable class
path support for systems with a wide native path character type, such as
wchar_t. —
end note ]
29.9.2 Class template basic_filebuf [filebuf]
namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_filebuf : public basic_streambuf<charT, traits> {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
basic_filebuf();
basic_filebuf(const basic_filebuf&) = delete;
basic_filebuf(basic_filebuf&& rhs);
virtual ~basic_filebuf();
basic_filebuf& operator=(const basic_filebuf&) = delete;
basic_filebuf& operator=(basic_filebuf&& rhs);
void swap(basic_filebuf& rhs);
bool is_open() const;
basic_filebuf* open(const char* s, ios_base::openmode mode);
basic_filebuf* open(const filesystem::path::value_type* s,
ios_base::openmode mode);
basic_filebuf* open(const string& s,
ios_base::openmode mode);
basic_filebuf* open(const filesystem::path& s,
ios_base::openmode mode);
basic_filebuf* close();
protected:
streamsize showmanyc() override;
int_type underflow() override;
int_type uflow() override;
int_type pbackfail(int_type c = traits::eof()) override;
int_type overflow (int_type c = traits::eof()) override;
basic_streambuf<charT, traits>* setbuf(char_type* s,
streamsize n) override;
pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out) override;
pos_type seekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out) override;
int sync() override;
void imbue(const locale& loc) override;
};
template<class charT, class traits>
void swap(basic_filebuf<charT, traits>& x,
basic_filebuf<charT, traits>& y);
}
The class
basic_filebuf<charT, traits>
associates both the input sequence and the output
sequence with a file
.The restrictions on reading and writing a sequence controlled by an
object of class
basic_filebuf<charT, traits>
are the same as for reading and writing with the C standard library
FILEs
.In particular:
- If the file is not open for reading the input sequence
cannot be read.
- If the file is not open for writing the output
sequence cannot be written.
- A joint file position is maintained for both the input sequence and
the output sequence.
An instance of
basic_filebuf
behaves as described in
[filebuf] provided
traits::pos_type
is
fpos<traits::state_type>. Otherwise the behavior is undefined
.In order to support file I/O and multibyte/wide character conversion,
conversions are performed using members of a facet, referred to as
a_codecvt in following subclauses, obtained as if by
const codecvt<charT, char, typename traits::state_type>& a_codecvt =
use_facet<codecvt<charT, char, typename traits::state_type>>(getloc());
Effects: Initializes the base class with
basic_streambuf<charT, traits>() (
[streambuf.cons])
. Postconditions: is_open() == false. basic_filebuf(basic_filebuf&& rhs);
Effects: It is
implementation-defined whether the sequence pointers in
*this
(
eback(),
gptr(),
egptr(),
pbase(),
pptr(),
epptr()) obtain
the values which
rhs had
. Whether they do or not,
*this
and
rhs reference separate buffers (if any at all) after the
construction
. Additionally
*this references the file
which
rhs did before the construction, and
rhs references no file after the construction
. The
openmode, locale and any other state of
rhs is also
copied
.Postconditions: Let
rhs_p refer to the state of
rhs just prior to this construction and let
rhs_a
refer to the state of
rhs just after this construction
. is_open() == rhs_p.is_open()
rhs_a.is_open() == false
gptr() - eback() == rhs_p.gptr() - rhs_p.eback()
egptr() - eback() == rhs_p.egptr() - rhs_p.eback()
pptr() - pbase() == rhs_p.pptr() - rhs_p.pbase()
epptr() - pbase() == rhs_p.epptr() - rhs_p.pbase()
if (eback()) eback() != rhs_a.eback()
if (gptr()) gptr() != rhs_a.gptr()
if (egptr()) egptr() != rhs_a.egptr()
if (pbase()) pbase() != rhs_a.pbase()
if (pptr()) pptr() != rhs_a.pptr()
if (epptr()) epptr() != rhs_a.epptr()
virtual ~basic_filebuf();
If an exception occurs during the destruction of the object, including the call to
close(), the exception is caught but not rethrown (see
[res.on.exception.handling])
. basic_filebuf& operator=(basic_filebuf&& rhs);
Effects: Calls
close() then move assigns from
rhs. After the
move assignment
*this has the observable state it would have had if it
had been move constructed from
rhs (see
[filebuf.cons])
.void swap(basic_filebuf& rhs);
Effects: Exchanges the state of
*this
and
rhs. template<class charT, class traits>
void swap(basic_filebuf<charT, traits>& x,
basic_filebuf<charT, traits>& y);
Effects: Equivalent to:
x.swap(y). Returns: true
if a previous call to
open
succeeded (returned a non-null value) and there has been no intervening
call to close
. basic_filebuf* open(const char* s, ios_base::openmode mode);
basic_filebuf* open(const filesystem::path::value_type* s,
ios_base::openmode mode);
Effects: If
is_open() != false,
returns a null pointer
. Otherwise,
initializes the
filebuf
as required
. It then opens
the file to which
s resolves, if possible,
as if by a call to
fopen
with the second argument determined from
mode & ~ios_base::ate
as indicated in Table
126. If
mode is not some combination of flags shown in the table then
the open fails
.Table
126: File open modes [tab:filebuf.open.modes]
ios_base flag combination | stdio equivalent |
binary | in | out | trunc | app | |
| | + | | | "w" |
| | + | | + | "a" |
| | | | + | "a" |
| | + | + | | "w" |
| + | | | | "r" |
| + | + | | | "r+" |
| + | + | + | | "w+" |
| + | + | | + | "a+" |
| + | | | + | "a+" |
+ | | + | | | "wb" |
+ | | + | | + | "ab" |
+ | | | | + | "ab" |
+ | | + | + | | "wb" |
+ | + | | | | "rb" |
+ | + | + | | | "r+b" |
+ | + | + | + | | "w+b" |
+ | + | + | | + | "a+b" |
+ | + | | | + | "a+b" |
If the open operation succeeds and
ios_base::ate is set in
mode,
positions the file to the end
(as if by calling
fseek(file, 0, SEEK_END), where
file is the pointer returned by calling
fopen)
.If the repositioning operation fails, calls
close()
and returns a null pointer to indicate failure
.Returns: this
if successful, a null pointer otherwise
. basic_filebuf* open(const string& s, ios_base::openmode mode);
basic_filebuf* open(const filesystem::path& s, ios_base::openmode mode);
Returns: open(s.c_str(), mode);
Effects: If
is_open() == false,
returns a null pointer
. If a put area exists, calls
overflow(traits::eof())
to flush characters
. If the last virtual member function called on
*this
(between
underflow,
overflow,
seekoff,
and
seekpos)
was
overflow
then calls
a_codecvt.unshift
(possibly several times) to determine a termination sequence, inserts those
characters and calls
overflow(traits::eof())
again
. Finally, regardless of whether any of the preceding calls fails or throws an
exception, the function closes the file
(as if by calling
fclose(file))
. If any of the calls made by the function, including
fclose, fails,
close fails by returning a null pointer
. If one of these calls throws an
exception, the exception is caught and rethrown after closing the file
.Returns: this
on success, a null pointer otherwise
. Postconditions: is_open() == false. streamsize showmanyc() override;
Remarks: An
implementation might well provide an overriding definition for this function
signature if it can determine that more characters can be read from the input
sequence
. int_type underflow() override;
Effects: Behaves according to the description of
basic_streambuf<charT, traits>::underflow(),
with the specialization that a sequence of characters is read from the input
sequence as if by reading from the associated file
into an internal buffer (
extern_buf)
and then as if by doing:
char extern_buf[XSIZE];
char* extern_end;
charT intern_buf[ISIZE];
charT* intern_end;
codecvt_base::result r =
a_codecvt.in(state, extern_buf, extern_buf+XSIZE, extern_end,
intern_buf, intern_buf+ISIZE, intern_end);
This shall be done in such a way that the class can recover the
position
(
fpos_t)
corresponding to each character between
intern_buf
and
intern_end. If the value of
r
indicates that
a_codecvt.in()
ran out of space in
intern_buf,
retry with a larger
intern_buf.int_type uflow() override;
Effects: Behaves according to the description of
basic_streambuf<charT, traits>::uflow(),
with the specialization that a sequence of characters is read from the input
with the same method as used by
underflow. int_type pbackfail(int_type c = traits::eof()) override;
Effects: Puts back the character designated by
c to the input
sequence, if possible, in one of three ways:
- If
traits::eq_int_type(c, traits::eof())
returns
false
and
if the function makes a putback position available
and if
traits::eq(to_char_type(c), gptr()[-1])
returns
true,
decrements the next pointer for the input sequence,
gptr().Returns:
c.
- If
traits::eq_int_type(c, traits::eof())
returns
false
and
if the function makes a putback position available
and if the function is permitted to assign to the putback position,
decrements the next pointer for the input sequence,
and stores c there.Returns:
c.
- If
traits::eq_int_type(c, traits::eof())
returns
true,
and if either the input sequence has a putback position available or
the function makes a putback position available,
decrements the next pointer for the input sequence,
gptr().Returns:
traits::not_eof(c).
Returns: As specified above, or
traits::eof()
to indicate failure
. Remarks: If
is_open() == false,
the function always fails
. The function does not put back a character directly to the input sequence
.If the function can succeed in more than one of these ways, it is
unspecified which way is chosen
. The function can alter the number of putback positions available as a result of any call
.int_type overflow(int_type c = traits::eof()) override;
Effects: Behaves according to the description of
basic_streambuf<charT, traits>::overflow(c),
except that the behavior of “consuming characters” is performed by first
converting as if by:
charT* b = pbase();
charT* p = pptr();
charT* end;
char xbuf[XSIZE];
char* xbuf_end;
codecvt_base::result r =
a_codecvt.out(state, b, p, end, xbuf, xbuf+XSIZE, xbuf_end);
and then
- If r == codecvt_base::error then fail.
- If r == codecvt_base::noconv then output characters from
b up to (and not including) p.
- If r == codecvt_base::partial then output to the file characters from
xbuf up to xbuf_end, and repeat using characters from
end to p. If output fails, fail (without repeating).
- Otherwise output from xbuf to xbuf_end, and fail if output fails. At this point if b != p and b == end (xbuf isn't large
enough) then increase XSIZE and repeat from the beginning.
Returns: traits::not_eof(c)
to indicate success, and
traits::eof()
to indicate failure
. If
is_open() == false,
the function always fails
.basic_streambuf* setbuf(char_type* s, streamsize n) override;
Effects: If
setbuf(0, 0)
is called on a stream before any I/O has occurred on that stream, the
stream becomes unbuffered
. Otherwise the results are
implementation-defined
. “Unbuffered” means that
pbase()
and
pptr()
always return null
and output to the file should appear as soon as possible
.pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out) override;
Effects: Let
width
denote
a_codecvt.encoding(). If
is_open() == false,
or
off != 0 && width <= 0,
then the positioning operation fails
. Otherwise, if
way != basic_ios::cur
or
off != 0,
and if the last operation was output,
then update the output sequence and write any unshift sequence
. Next, seek to the new position: if
width > 0,
call
fseek(file, width * off, whence),
otherwise call
fseek(file, 0, whence).Remarks: “The last operation was output” means either
the last virtual operation was overflow or
the put buffer is non-empty
. “Write any unshift sequence” means,
if
width
if less than zero then call
a_codecvt.unshift(state, xbuf, xbuf+XSIZE, xbuf_end)
and output the resulting unshift sequence
. The function determines one of three values for the
argument
whence, of type
int,
as indicated in Table
127.Table
127:
seekoff effects [tab:filebuf.seekoff]
way Value | stdio Equivalent |
basic_ios::beg | SEEK_SET |
basic_ios::cur | SEEK_CUR |
basic_ios::end | SEEK_END |
Returns: A newly constructed
pos_type
object that stores the resultant
stream position, if possible
. If the positioning operation fails, or
if the object cannot represent the resultant stream position,
returns
pos_type(off_type(-1)).pos_type seekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out) override;
Alters the file position, if possible, to correspond to the position
stored in
sp (as described below)
. Altering the file position performs as follows:
- 1.if
(om & ios_base::out) != 0,
then update the output sequence and
write any unshift sequence;
- 2.set the file position to sp as if by a call to fsetpos;
- 3.if
(om & ios_base::in) != 0,
then update the input sequence;
where
om is the open mode passed to the last call to
open(). The operation fails if
is_open()
returns
false.If
sp is an invalid stream position, or if the function positions
neither sequence, the positioning operation fails
. If
sp has not been obtained by a previous successful call to one of
the positioning functions
(
seekoff
or
seekpos)
on the same file the effects are undefined
. Otherwise returns
pos_type(off_type(-1)). Effects: If a put area exists, calls
filebuf::overflow
to write the characters to the file,
then flushes the file as if by calling
fflush(file). If a get area exists, the effect is
implementation-defined
.void imbue(const locale& loc) override;
Preconditions: If the file is not positioned at its beginning and the encoding of the current
locale as determined by
a_codecvt.encoding()
is state-dependent (
[locale.codecvt.virtuals])
then that facet is the same as
the corresponding facet of
loc. Effects: Causes characters inserted or extracted after this call
to be converted according to
loc until another call of
imbue. Remarks: This may require reconversion of previously converted characters
. This in turn may require the implementation to be able to reconstruct
the original contents of the file
.
namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_ifstream : public basic_istream<charT, traits> {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
basic_ifstream();
explicit basic_ifstream(const char* s,
ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const string& s,
ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path& s,
ios_base::openmode mode = ios_base::in);
basic_ifstream(const basic_ifstream&) = delete;
basic_ifstream(basic_ifstream&& rhs);
basic_ifstream& operator=(const basic_ifstream&) = delete;
basic_ifstream& operator=(basic_ifstream&& rhs);
void swap(basic_ifstream& rhs);
basic_filebuf<charT, traits>* rdbuf() const;
bool is_open() const;
void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in);
void open(const string& s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in);
void close();
private:
basic_filebuf<charT, traits> sb;
};
template<class charT, class traits>
void swap(basic_ifstream<charT, traits>& x,
basic_ifstream<charT, traits>& y);
}
The class
basic_ifstream<charT, traits>
supports reading from named files
. It uses a
basic_filebuf<charT, traits>
object to control the associated
sequence
. For the sake of exposition, the maintained data is presented here as:
Effects: Initializes the base class with
basic_istream<charT, traits>(addressof(sb)) (
[istream.cons])
and
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons])
. explicit basic_ifstream(const char* s,
ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in);
Effects: Initializes the base class with
basic_istream<charT, traits>(addressof(sb)) (
[istream.cons])
and
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons]),
then calls
rdbuf()->open(s, mode | ios_base::in). If that function returns a null pointer, calls
setstate(failbit).explicit basic_ifstream(const string& s,
ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path& s,
ios_base::openmode mode = ios_base::in);
Effects: Equivalent to:
basic_ifstream(s.c_str(), mode). basic_ifstream(basic_ifstream&& rhs);
Effects: Move constructs the base class, and the contained
basic_filebuf. Then calls
basic_istream<charT, traits>::set_rdbuf(addressof(sb))
to install the contained
basic_filebuf.void swap(basic_ifstream& rhs);
Effects: Exchanges the state of
*this
and
rhs by calling
basic_istream<charT, traits>::swap(rhs) and
sb.swap(rhs.sb). template<class charT, class traits>
void swap(basic_ifstream<charT, traits>& x,
basic_ifstream<charT, traits>& y);
Effects: Equivalent to:
x.swap(y). basic_filebuf<charT, traits>* rdbuf() const;
Returns: const_cast<basic_filebuf<charT, traits>*>(addressof(sb)). Returns: rdbuf()->is_open(). void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in);
Effects: Calls
rdbuf()->open(s, mode | ios_base::in). If that function does not return a null pointer
calls
clear(),
otherwise calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.void open(const string& s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in);
Effects: Calls
open(s.c_str(), mode). Effects: Calls
rdbuf()->close()
and, if that function returns
a null pointer,
calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.
namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_ofstream : public basic_ostream<charT, traits> {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
basic_ofstream();
explicit basic_ofstream(const char* s,
ios_base::openmode mode = ios_base::out);
explicit basic_ofstream(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::out);
explicit basic_ofstream(const string& s,
ios_base::openmode mode = ios_base::out);
explicit basic_ofstream(const filesystem::path& s,
ios_base::openmode mode = ios_base::out);
basic_ofstream(const basic_ofstream&) = delete;
basic_ofstream(basic_ofstream&& rhs);
basic_ofstream& operator=(const basic_ofstream&) = delete;
basic_ofstream& operator=(basic_ofstream&& rhs);
void swap(basic_ofstream& rhs);
basic_filebuf<charT, traits>* rdbuf() const;
bool is_open() const;
void open(const char* s, ios_base::openmode mode = ios_base::out);
void open(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::out);
void open(const string& s, ios_base::openmode mode = ios_base::out);
void open(const filesystem::path& s, ios_base::openmode mode = ios_base::out);
void close();
private:
basic_filebuf<charT, traits> sb;
};
template<class charT, class traits>
void swap(basic_ofstream<charT, traits>& x,
basic_ofstream<charT, traits>& y);
}
The class
basic_ofstream<charT, traits>
supports writing to named files
. It uses a
basic_filebuf<charT, traits>
object to control the associated
sequence
. For the sake of exposition, the maintained data is presented here as:
Effects: Initializes the base class with
basic_ostream<charT, traits>(addressof(sb)) (
[ostream.cons])
and
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons])
. explicit basic_ofstream(const char* s,
ios_base::openmode mode = ios_base::out);
explicit basic_ofstream(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::out);
Effects: Initializes the base class with
basic_ostream<charT, traits>(addressof(sb)) (
[ostream.cons])
and
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons]),
then calls
rdbuf()->open(s, mode | ios_base::out). If that function returns a null pointer, calls
setstate(failbit).explicit basic_ofstream(const string& s,
ios_base::openmode mode = ios_base::out);
explicit basic_ofstream(const filesystem::path& s,
ios_base::openmode mode = ios_base::out);
Effects: Equivalent to:
basic_ofstream(s.c_str(), mode). basic_ofstream(basic_ofstream&& rhs);
Effects: Move constructs the base class, and the contained
basic_filebuf. Then calls
basic_ostream<charT, traits>::set_rdbuf(addressof(sb))
to install the contained
basic_filebuf.void swap(basic_ofstream& rhs);
Effects: Exchanges the state of
*this
and
rhs by calling
basic_ostream<charT, traits>::swap(rhs) and
sb.swap(rhs.sb). template<class charT, class traits>
void swap(basic_ofstream<charT, traits>& x,
basic_ofstream<charT, traits>& y);
Effects: Equivalent to:
x.swap(y). basic_filebuf<charT, traits>* rdbuf() const;
Returns: const_cast<basic_filebuf<charT, traits>*>(addressof(sb)). Returns: rdbuf()->is_open(). void open(const char* s, ios_base::openmode mode = ios_base::out);
void open(const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::out);
Effects: Calls
rdbuf()->open(s, mode | ios_base::out). If that function does not return a null pointer
calls
clear(),
otherwise calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.Effects: Calls
rdbuf()->close()
and, if that function fails (returns a null pointer), calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
. void open(const string& s, ios_base::openmode mode = ios_base::out);
void open(const filesystem::path& s, ios_base::openmode mode = ios_base::out);
Effects: Calls
open(s.c_str(), mode). 29.9.5 Class template basic_fstream [fstream]
namespace std {
template<class charT, class traits = char_traits<charT>>
class basic_fstream : public basic_iostream<charT, traits> {
public:
using char_type = charT;
using int_type = typename traits::int_type;
using pos_type = typename traits::pos_type;
using off_type = typename traits::off_type;
using traits_type = traits;
basic_fstream();
explicit basic_fstream(
const char* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
explicit basic_fstream(
const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in|ios_base::out);
explicit basic_fstream(
const string& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
explicit basic_fstream(
const filesystem::path& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
basic_fstream(const basic_fstream&) = delete;
basic_fstream(basic_fstream&& rhs);
basic_fstream& operator=(const basic_fstream&) = delete;
basic_fstream& operator=(basic_fstream&& rhs);
void swap(basic_fstream& rhs);
basic_filebuf<charT, traits>* rdbuf() const;
bool is_open() const;
void open(
const char* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
void open(
const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in|ios_base::out);
void open(
const string& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
void open(
const filesystem::path& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
void close();
private:
basic_filebuf<charT, traits> sb;
};
template<class charT, class traits>
void swap(basic_fstream<charT, traits>& x,
basic_fstream<charT, traits>& y);
}
The
class template
basic_fstream<charT, traits>
supports reading and writing from named files
. It uses a
basic_filebuf<charT, traits>
object to control the associated sequences
. For the sake of exposition, the maintained data is presented here as:
- sb, the basic_filebuf object.
Effects: Initializes the base class with
basic_iostream<charT, traits>(addressof(sb)) (
[iostream.cons])
and
sb with
basic_filebuf<charT, traits>(). explicit basic_fstream(
const char* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
explicit basic_fstream(
const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
Effects: Initializes the base class with
basic_iostream<charT, traits>(addressof(sb)) (
[iostream.cons])
and
sb with
basic_filebuf<charT, traits>(). Then calls
rdbuf()->open(s, mode). If that function returns a null pointer, calls
setstate(failbit).explicit basic_fstream(
const string& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
explicit basic_fstream(
const filesystem::path& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
Effects: Equivalent to:
basic_fstream(s.c_str(), mode). basic_fstream(basic_fstream&& rhs);
Effects: Move constructs the base class, and the contained
basic_filebuf. Then calls
basic_istream<charT, traits>::set_rdbuf(addressof(sb))
to install the contained
basic_filebuf.void swap(basic_fstream& rhs);
Effects: Exchanges the state of
*this
and
rhs by calling
basic_iostream<charT,traits>::swap(rhs) and
sb.swap(rhs.sb). template<class charT, class traits>
void swap(basic_fstream<charT, traits>& x,
basic_fstream<charT, traits>& y);
Effects: Equivalent to:
x.swap(y). basic_filebuf<charT, traits>* rdbuf() const;
Returns: const_cast<basic_filebuf<charT, traits>*>(addressof(sb)). Returns: rdbuf()->is_open(). void open(
const char* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
void open(
const filesystem::path::value_type* s,
ios_base::openmode mode = ios_base::in | ios_base::out);
Effects: Calls
rdbuf()->open(s, mode). If that function does not return a null pointer calls
clear(),
otherwise calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.void open(
const string& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
void open(
const filesystem::path& s,
ios_base::openmode mode = ios_base::in | ios_base::out);
Effects: Calls
open(s.c_str(), mode). Effects: Calls
rdbuf()->close()
and, if that function
returns a null pointer,
calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.