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

3
根据C++17标准,fstream、ifstream和ofstream类的某些构造函数和open函数的第二个参数表示要打开文件的模式。这些参数分别为:
ios_base::openmode mode = ios_base::in | ios_base::out
ios_base::openmode mode = ios_base::in
ios_base::openmode mode = ios_base::out

我在互联网和C++书籍中读到了几种看似矛盾的关于mode参数的非默认行为的解释,尤其是对于fstream。但我在标准本身中找不到任何可以解释它的内容。以下是我读到的一些内容,我希望能够得到澄清,特别是非默认行为,并提供标准的参考(如果可能):
fstream:
1. 没有默认模式 - 这显然是错误的,基于上述内容。
2. 如果完全省略mode参数,则默认模式为ios_base::in | ios_base::out。如果提供了mode参数,则模式仅由实际在该参数中指定的标志决定。
ifstream:
默认模式为ios_base::in。如果提供了mode参数,则将其标志与ios_base::in进行OR运算。
ofstream:
默认模式为ios_base::out。如果提供了mode参数,则将其标志与ios_base::out进行OR运算。
最后,虽然我可以在书籍和在线资源中轻松找到所有定义的标志的含义,但我在标准本身中找不到它们的含义明确定义 - 只有展示使用它们的示例。标准中是否有某种表格或等效内容来汇总它们?
谢谢, Ray

1
标准以C打开模式的术语来定义打开模式。在有人能为您提供完整答案之前,我会继续深入挖掘并查看是否能找到其余部分。 - user4581301
1个回答

4
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 提到了对于basic_ofstream需要使用mode | ios_base::out. 然而,fstream构造函数直接传递mode参数:

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

mode的含义在[filebuf.members]中的表格中被定义,它是基于C标准库中fopen所接受的模式字符串的。而C标准中这个字符串的意义也可以从相应文献中找到。

还有一个OR。不知道我在探险时为什么看不到它。 - user4581301
1
这是否意味着如果我们在模式参数中没有指定它们中的任何一个,实例化std::fstream时就不能读取或写入? - user1095108
1
如果mode不是表中显示的标志的某些组合,则打开失败。 - Igor Tandetnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接