在文件处理中,我遇到了 ifstream、ofstream 和 fstream。谁能告诉我它们之间的主要区别?
类层次结构如下所示: 来自 https://www.cplusplus.com/img/iostream.gif
处理文件处理的三个类是:
basic_ifstream
basic_ofstream
basic_fstream
ifstream
、ofstream
和fstream
是“char
”模板专业化,这意味着它们只不过是basic_ifstream<char>
、basic_ofstream<char>
和basic_fstream<char>
,即它们处理读取和写入char
s来自文件。
ifstream
是输入文件流,允许您读取文件的内容。ofstream
是输出文件流,允许您将内容写入文件。fstream
默认情况下允许读取和写入文件。但是,您可以通过传入 fstream
标志来让 ifstream
表现得像 ofstream
或 ios::open_mode
。ios::openmode
旗帜开放模式标志是:
旗帜 | 描述 |
---|---|
|
所有写操作必须发生在文件末尾 |
|
以二进制模式打开 |
|
开放阅读 |
|
开放写作 |
|
打开后清空文件内容 |
|
打开后转到文件末尾 |
这些标志是可加的,这意味着您可以使用按位 OR
|
运算符组合多个标志。如果我想以二进制模式打开文件并追加,我可以按如下方式组合标志:
ios::binary | ios::app
ifstream
始终设置 ios::in
标志,且无法删除。类似地,ofstream
始终设置了ios::out
标志,并且无法将其删除。添加的任何其他标志将与 ios::in
(对于 ifstream
)和 ios::out
(对于 ofstream
fstream
传递任何标志,则默认值为 ios::in | ios::out
,因此您可以读取也可以写入文件。但是,如果您为 fstream
显式指定一个标志(如 ios::in
),则它将仅打开用于读取,如 ifstream
。您可以在构造函数中或调用时执行此操作
open()
:
ifstream infile("filepath", ios::binary); //Open the file for reading in binary mode, ios::in will always be set
ofstream outfile("filepath", ios::trunc); // Open the file for writing and clear its contents, ios::out is implicitly set
fstream inoutfile("filepath") // default flag will be: ios::in | ios::out hence both reads and writes possible
fstream infile("filepath", ios::in) // file will be opened in read mode like fstream
基本上可以不使用
ifstream
和 ofstream
并始终使用 fstream
和所需的标志。但在设置标志时很容易出现意外错误。因此,使用 ifstream
您可以确保永远不会发生写入,而使用 ofstream
只会发生写入。
ios::noreplace
)C++ 23 添加了
ios::noreplace
标志,该标志打开一个专门用于写入的文件。如果文件已经存在,则无法打开。
ifstream
仅用于输入。
ofstream
仅用于输出。
fstream
可用于输入和/或输出。
关键在于名字:
ifstream
=“输入文件流”,是 istream
或“输入流”ofstream
=“输出文件流”,这是一种 ostream
或“输出流”fstream
=“(双向)文件流”,如iostream
(“输入/输出流”),如通过继承包括两个方面