fstream、ifstream 和 ofstream 的开放模式行为

Open mode behaviors for fstream, ifstream, and ofstream

根据 C++17,fstream、ifstream 和 ofstream 的一些构造函数和打开函数的第二个参数 类 表示文件打开的模式。这些参数分别是:

ios_base::openmode mode = ios_base::in | ios_base::out
ios_base::openmode mode = ios_base::in
ios_base::openmode mode = ios_base::out

我已经在 Internet 和 C++ 书籍中阅读了关于模式参数的非默认行为的几个不同的看似矛盾的东西,尤其是对于 fstream,但我找不到任何我可以在标准本身中破译的东西关于它。以下是我读过的一些内容,我想对它们进行澄清,尤其是非默认行为,如果可能,请参考标准:

fstream:

  1. 没有默认模式。 -- 根据以上所述,这显然似乎是错误的。
  2. 默认模式为ios_base::in | ios_base::out 仅当模式参数完全省略时。如果提供,则模式仅由该参数中实际指定的标志决定。

ifstream:

默认模式为ios_base::in。如果提供模式参数,其标志将与 ios_base::in.

进行“或”运算

流媒体:

默认模式为ios_base::out。如果提供模式参数,其标志将与 ios_base::out.

进行或运算

最后,虽然我可以很容易地找到书籍和网上定义的所有标志的含义,但我找不到标准本身中明确定义的它们的含义 - 只是显示它们被使用的示例。标准中是否有 table 某种或等价物来整合它们?

谢谢, 雷

explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in);

[ifstream.cons]/2 Constructs an object of class basic_­ifstream<charT, traits> ... then calls rdbuf()->open(s, mode | ios_­base::in)

类似地,[ofstream.cons]/2 提到 mode | ios_base::out basic_ofstream。但是,fstream 构造函数直接通过模式:

[fstream.cons]/2 ... Then calls rdbuf()->open(s, mode)

mode的含义由[filebuf.members]中的this table定义,根据传递给[=18的模式字符串=] 来自 C 标准库。反过来,其含义在 C 标准中定义。