std::of流默认情况下是截断还是附加

Does std::ofstream truncate or append by default?

本文关键字:情况下 of 默认 std      更新时间:2023-10-16

如果在没有openmode标志的情况下调用std::ofstream构造函数,则默认标志为ios_base::out。但这意味着ios_base::trunc还是ios_base::app

换句话说,如果您的文件系统中已经有一个非空文件"passer.txt",并且您调用

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

"新内容"会被附加到"过去的.txt"的先前内容上吗?还是会取代先前的内容?

短版本

默认情况下会截断。


中等版本

这个标准基本上是意大利面条,但它最终归结为说它相当于说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]开始,它将构造函数的行为描述为

效果:构造class basic_ofstream<charT,traits>的对象,使用初始化基类basic_ostream(&sb(和用basic_filebuf<charT,traits>())初始化sb(27.7.3.2、27.9.1.2(,则调用CCD_ 11。如果该函数返回空指针,则调用setstate(failbit)

其中rdbuf()返回basic_filebuf<charT,traits>*(27.9.1.13[流](

这就引出了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 modstr是根据CCD_ 20确定的,如表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...                           |

这让我们看到了同一页上的脚注:

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

不出所料,它将我们发送到27.9.2[c.files],它提供了几乎无用的表134,但随后引用了c标准:

另请参见:ISO C 7.9,修改件1 4.6.2。

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