If you call the std::ofstream
constructor without openmode
flags, the default flag is ios_base::out
. But does this imply ios_base::trunc
or ios_base::app
?
In other words, if you already have a non-empty file "past.txt" in your file system and you call
std::ofstream stream( "past.txt" );
stream << "new content";
will "new content" be appended to the prior contents of "past.txt" or will it replace the prior contents?
In order for us to append to a file, we must put the ofstream() function in append mode, which we explain in the next paragraph. With the full line, ofstream writer("file1. txt", ios::app);, we now create a connection to open up the file1. txt file in order to append contents to the file.
The default mode of ifstream is in . The default mode of ofstream is out . That's why they're named that way. fstream has no default mode.
It truncates by default.
The standard is basically spaghetti on this, but it eventually boils down to saying that it's the equivalent of saying fopen(const char*, "w")
(27.9.1.4 [filebuf.members]), which then points us towards the ISO C 7.9 standard.
Checking that out provides us with §7.19.5.3, "The fopen function", which specifies the behavior when "w" is passed:
w truncate to zero length or create text file for writing
Effects: Constructs an object of
class basic_ofstream<charT,traits>
, initializing the base class withbasic_ostream(&sb
) and initializingsb
withbasic_filebuf<charT,traits>())
(27.7.3.2, 27.9.1.2), then callsrdbuf()->open(s, mode|ios_base::out)
. If that function returns a null pointer, callssetstate(failbit)
.
Where rdbuf()
returns basic_filebuf<charT,traits>*
(27.9.1.13 [ofstream])
Which leads us to 27.9.1.1 [filebuf], or more specifically, 27.9.1.4 [filebuf.members] , which describes the open
function:
basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);
as
Effects: If
is_open() != false
, returns a null pointer. Otherwise, initializes the filebuf as required. It then opens a file, if possible, whose name is the NTBSs
(as if by callingstd::fopen(s,modstr)
). The NTBSmodstr
is determined frommode & ~ios_base::ate
as indicated in Table 132. If mode is not some combination of flags shown in the table then the open fails.
NTBS: Null-terminated byte-string
Table 132 describes equivalence rules between C++ ios_base::openmode
and C-style stdio strings:
Table 132 — File open modes | | 'ios_base' flag combination | 'stdio' equivalent | | binary | in | out | trunc | app | | | | | + | | | "w" | | etc... |
Which leads us to a footnote on the same page that states:
...the function signatures
fopen(const char*, const char*)
andfseek(FILE*, long, int)
are declared, in<cstdio>
(27.9.2).
Which sends us, predictably, to 27.9.2 [c.files], which provides the nearly useless Table 134, but then references the C standard:
See also: ISO C 7.9, Amendment 1 4.6.2.
Which I talk about in the main portion of this answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With