Reputation: 11547
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?
Upvotes: 27
Views: 19483
Reputation: 41100
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.
Upvotes: 57