Does std::ofstream truncate or append by default?

时间:2016-08-31 18:48:16

标签: c++ fstream

If you call the std::ofstream constructor without openmode flags, the default flag is ios_base::out. But does this imply ios_base::trunc or ios_base::app?

In other words, if you already have a non-empty file "past.txt" in your file system and you call

std::ofstream stream( "past.txt" );
stream << "new content";

will "new content" be appended to the prior contents of "past.txt" or will it replace the prior contents?

1 个答案:

答案 0 :(得分:25)

短版

默认情况下会截断。

中等版本

标准基本上就是意大利面,但它最终归结为说它相当于说fopen(const char*, "w")(27.9.1.4 [filebuf.members]),然后我们指向ISO C 7.9标准。

检查出来为我们提供了§7.19.5.3,“fopen函数”,它指定了传递“w”时的行为:

  

w截断为零长度或创建用于写入的文本文件

长版本

如果你想自己跟踪意大利面条,请从27.9.1.11 [ofstream.cons]开始,它将构造函数的行为描述为

< / p>

  

效果:构造一个class basic_ofstream<charT,traits>的对象,用它初始化基类   basic_ostream(&sb}并使用sb初始化basic_filebuf<charT,traits>())(27.7.3.2,27.9.1.2),   然后拨打rdbuf()->open(s, mode|ios_base::out)。如果该函数返回空指针,则调用   setstate(failbit)

rdbuf()返回basic_filebuf<charT,traits>*(27.9.1.13 [ofstream])

这引出了我们27.9.1.1 [filebuf],或者更具体地说,27.9.1.4 [filebuf.members],它描述了open函数:

basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);

作为

  

效果:如果is_open() != false,则返回空指针。否则,根据需要初始化filebuf。   然后,如果可能,它会打开一个文件,其名称为NTBS s(就像通过调用std::fopen(s,modstr)一样)。   NTBS modstrmode & ~ios_base::ate确定,如表132所示。如果模式为   不是表格中显示的某些标志组合,那么开放失败。

NTBS:以空值终止的字节串

表132描述了C ++ ios_base::openmode和C风格的stdio字符串之间的等价规则:

Table 132 — File open modes
|
|   'ios_base' flag combination   | 'stdio' equivalent |
| binary | in | out | trunc | app |                    |
|        |    |  +  |       |     |        "w"         |
|                     etc...                           |

这引出了我们在同一页面上的脚注:

  

...函数签名fopen(const char*, const char*)fseek(FILE*, long, int)<cstdio>(27.9.2)中声明。

可预见地,它向27.9.2 [c.files]发送了我们,它提供了几乎无用的表134,但随后引用了C标准:

  

参见:ISO C 7.9,修订1 4.6.2。

我在这个答案的主要部分谈到了这一点。