如果在std::ofstream没有openmode标志的情况下ios_base::out调用构造函数,则默认标志为.但这是暗示ios_base::trunc还是ios_base::app?
换句话说,如果您的文件系统中已经有一个非空文件"past.txt"并且您正在调用
std::ofstream stream( "past.txt" );
stream << "new content";
Run Code Online (Sandbox Code Playgroud)
"新内容"是否会附加到"past.txt"的先前内容中,还是会替换先前的内容?
And*_*dyG 27
它默认截断.
标准基本上就是意大利面,但它最终归结为说它相当于说fopen(const char*, "w")(27.9.1.4 [filebuf.members]),然后我们指向ISO C 7.9标准.
检查出来为我们提供了§7.19.5.3,"fopen函数",它指定了传递"w"时的行为:
w截断为零长度或创建用于写入的文本文件
效果:构造一个对象
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);
Run Code Online (Sandbox Code Playgroud)
如
效果:如果
is_open() != false,返回空指针.否则,根据需要初始化filebuf.然后它会打开一个文件,如果可能的话,其名称是NTBSs(就像通过调用一样std::fopen(s,modstr)).NTBSmodstr由mode & ~ios_base::ate表132中的表示确定.如果模式不是表中所示的标志的某种组合,则打开失败.
NTBS:以空值终止的字节串
表132描述了C++ ios_base::openmode和C风格的stdio字符串之间的等价规则:
Run Code Online (Sandbox Code Playgroud)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.
我在这个答案的主要部分谈到了这个问题.
| 归档时间: |
|
| 查看次数: |
4175 次 |
| 最近记录: |