以下代码是使用VC ++ 2012年11月版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?
}
}
The cppreference.com website并未说明ios::app
无法与ios::trunc
合并。
ios::app
和ios::trunc
的完全语义是什么?
答案 0 :(得分:21)
传递这些标志的filebuf
构造函数†具有基于C ++ 11中表132中定义的那些标志的行为:
+-----------------------------------+-------------------+
| 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]
&amp; [C++11: 27.9.1.11/2]
向我们显示模式从流对象传递到缓冲区对象。
答案 1 :(得分:6)
正如您所看到的,将两者放在一起是没有意义的。