C++ 为什么ofstream(“log.txt”,ios::app | ios::trunc);总是失败?
以下代码是在Windows 7 x64上使用VC++2012年11月CTP编译的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!
#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约定相比,它的混乱程度要小得多。请保留评论,以便提问和回答澄清问题。应保留对特定主题的扩展讨论。此外,将删除演变为点名的讨论。