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

时间:2019-01-19 21:26:46

标签: c++ fstream

根据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 ++书籍中阅读了一些关于mode参数的非默认行为(特别是对于fstream)的看似矛盾的东西,尤其是对于fstream而言,我找不到任何可以理解的关于标准参数的内容。以下是我已阅读的一些内容,我想对它们进行澄清,尤其是非默认行为,并在可能的情况下引用标准:

fstream:

  1. 没有默认模式。 -根据上述情况,这显然是错误的。
  2. 默认模式是ios_base :: in | ios_base :: out仅在完全省略mode参数时。如果提供了该模式,则仅由该参数中实际指定的标志确定。

ifstream:

默认模式是ios_base :: in。如果提供了模式参数,则其标志将与ios_base :: in进行“或”运算。

流:

默认模式是ios_base :: out。如果提供了模式参数,则其标志将与ios_base :: out进行“或”运算。

最后,尽管我可以轻松地找到书籍和在线中定义的所有标志的含义,但我无法在标准本身中找到明确定义的标志的含义-仅显示使用它们的示例。在标准中是否存在某种形式的表格或等同形式的表格?

谢谢, 雷

1 个答案:

答案 0 :(得分:3)

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

[ifstream.cons]/2构造类basic_­ifstream<charT, traits>的对象,然后调用rdbuf()->open(s, mode | ios_­base::in)

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

  

[fstream.cons]/2 ...然后呼叫rdbuf()->open(s, mode)

根据this table [filebuf.members] 中的定义,here的含义取决于从C标准库传递给mode的模式字符串。反过来,其含义在C标准中定义。