根据 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,但我找不到任何我可以在标准本身中破译的内容.以下是我读过的一些内容,我想对它们进行澄清,尤其是非默认行为,如果可能,请引用标准:
流媒体:
- 没有默认模式。 -- 根据以上所述,这显然似乎是错误的。
- 默认模式是ios_base::in | ios_base::out 仅当模式参数被完全省略时。如果提供,则模式仅由该参数中实际指定的标志决定。
如果流:
默认模式是 ios_base::in。如果提供了模式参数,其标志将与 ios_base::in 进行或运算。
流:
默认模式是 ios_base::out。如果提供了模式参数,其标志将与 ios_base::out 进行或运算。
最后,虽然我可以很容易地找到在书籍和网上定义的所有标志的含义,但我找不到在标准本身中明确定义的它们的含义 - 只是显示它们被使用的示例。标准中是否有某种表格或等效表格来整合它们?
谢谢, 雷
最佳答案
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 callsrdbuf()->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
的含义由 this table 定义在 [filebuf.members] 中,根据传递给 fopen
的模式字符串来自 C 标准库。反过来,其含义在 C 标准中定义。
关于c++ - fstream、ifstream 和 ofstream 的开放模式行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271539/