C++ 为什么ofstream(“log.txt”,ios::app | ios::trunc);总是失败?

C++ 为什么ofstream(“log.txt”,ios::app | ios::trunc);总是失败?,c++,iostream,C++,Iostream,以下代码是在Windows 7 x64上使用VC++2012年11月CTP编译的 #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!

以下代码是在Windows 7 x64上使用VC++2012年11月CTP编译的

#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?
    }
}
#包括
使用名称空间std;
int main()
{
of Stream fout(“log.txt”,ios::app | ios::trunc);
如果(!fout)
{
cout
  • app(=append):在每次输出操作之前,将流的位置指示器设置为流的末尾
  • trunc(=truncate)任何当前内容都将被丢弃,假设打开时的长度为零

如您所见,将两者放在一起是没有意义的。

将这些标志传递到的
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]:
[…]如果
模式
不是表中显示的一些标志组合,则打开失败

这就是语义


[C++11:27.9.1.7/2]
[C++11:27.9.1.11/2]
告诉我们模式是从流对象传递到缓冲区对象的。

文档中没有说
ios::app
不能与
ios::trunc
组合。你想做什么?std::ios::trunc基本上会丢弃所有内容,而std::ios::app会追加任何内容。@CLearner,只是为了记录。删除旧内容和ap@ LeNNESS RraceSeEnguleC++有一个官方文档:ISO 14882。当纯粹问C++问题时,链接到其他站点是没有意义的;语言是由标准定义的。(当然,许多问题涉及一个或多个编译器的细节,而不仅仅是语言。)这是一个好答案。但是,我想给薄熙来一个好的评价,因为他是第一个给出正确答案的人。他的回答是一个评论而不是一个答案。@xmlmx,这个评论现在已经被主持人的直率斧头删除了。忍不住大笑起来。“wb”与fstream约定相比,它的混乱程度要小得多。请保留评论,以便提问和回答澄清问题。应保留对特定主题的扩展讨论。此外,将删除演变为点名的讨论。