繁体   English   中英

std :: ofstream是否会截断或追加默认值?

[英]Does std::ofstream truncate or append by default?

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

换句话说,如果您的文件系统中已经有一个非空文件“past.txt”并且您正在调用

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

“新内容”是否会附加到“past.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),然后调用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 modstr mode & ~ios_base::ate确定,如表132所示。如果mode不是表中显示的某些标志组合,则open打开失败。

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。

我在这个答案的主要部分谈到了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM