Следующий код был скомпилирован с VC ++ Nov 2012 CTP на 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?
}
}
Сайт cppreference.com не говорит, что ios::app
нельзя сочетать с ios::trunc
,
Каковы точный семантика ios::app
а также ios::trunc
?
filebuf
конструктор, которому передаются эти флаги† имеет поведения, основанные на этих флагах, определенных в таблице 132 в 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" |
+-----------------------------------+-------------------+
Как видите, ваша комбинация флагов не нашел в этой таблице.
[C++11: 27.9.1.4/2]:
[..] Еслиmode
если в таблице не показана какая-то комбинация флагов, то открытие завершится неудачно.
Это семантика.
† [C++11: 27.9.1.7/2]
& [C++11: 27.9.1.11/2]
покажите нам, что режим передается из объекта потока в объект буфера.
Как видите, не имеет смысла соединять их вместе.