The following code was compiled with VC++ Nov 2012 CTP on Windows 7 x64.
#include <fstream>
using namespace std;
int main()
{
ofstream fout("log.txt", ios::app|ios::trunc);
if (!fout)
{
cout << "An error occurred!" << endl; // Always go here! Why?
}
}
The cppreference.com website doesn't say that ios::app
cannot be combined with ios::trunc
.
What are the exact semantics of ios::app
and ios::trunc
?
The filebuf
constructor to which these flags are passed† has behaviours based on those flags defined in Table 132 in C++11:
+-----------------------------------+-------------------+
| 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" |
+-----------------------------------+-------------------+
As you can see, your flag combination is not found in that table.
[C++11: 27.9.1.4/2]:
[..] Ifmode
is not some combination of flags shown in the table then the open fails.
Those are the semantics.
†[C++11: 27.9.1.7/2]
& [C++11: 27.9.1.11/2]
show us that the mode is passed from the stream object to the buffer object.
As you can see, it doesn't make sense to put both together.
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