ifstream、ofstream 和 fstream 之间有什么区别?
What is the difference between ifstream, ofstream and fstream?
在文件处理中,我遇到了 ifstream、ofstream 和 fstream。谁能告诉我它们之间的主要区别?
ifstream 仅用于输入。
ofstream 仅用于输出。
fstream 可用于 both/either 输入 and/or 输出。
关键在名字里:
ifstream
= "input file stream" 是 istream
或 "input stream" 的一种类型
ofstream
= "output file stream" 是 ostream
或 "output stream" 的一种类型
fstream
=“(双向)文件流”,如 iostream
(“input/output 流”),如 includes both aspects 通过继承
这是 class 层次结构的样子:
来自https://www.cplusplus.com/img/iostream.gif
处理文件处理的三个 classes 是:
basic_ifstream
basic_ofstream
basic_fstream
ifstream
、ofstream
和 fstream
是“char
” template specializations 这意味着它们只是 basic_ifstream<char>
、basic_ofstream<char>
和 basic_fstream<char>
即它们处理从文件中读取和写入 char
s。
ifstream
是允许您读取文件内容的输入文件流。
ofstream
是输出文件流,允许您将内容写入文件。
fstream
默认允许读取和写入文件。但是,您可以通过传入 ios::open_mode
标志让 fstream
表现得像 ifstream
或 ofstream
。
ios::openmode
标志
打开模式标志是:
Flag
Description
ios::app
All write operations must occur at the end of the file
ios::binary
Open in binary mode
ios::in
Open for reading
ios::out
Open for writing
ios::trunc
Empty the contents of the file after opening
ios::ate
Go to the end of the file after opening
这些标志是可加的,这意味着您可以使用按位或 |
运算符组合多个标志。如果我想以二进制模式打开文件并追加,我可以按如下方式组合标志:
ios::binary | ios::app
ifstream
始终设置了 ios::in
标志,并且无法将其删除。类似地,ofstream
始终设置了 ios::out
标志,并且无法将其删除。添加的任何其他标志将与 ifstream
的 ios::in
和 ofstream
的 ios::out
组合
- 另一方面,如果您不向
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
只会发生写入。
在文件处理中,我遇到了 ifstream、ofstream 和 fstream。谁能告诉我它们之间的主要区别?
ifstream 仅用于输入。
ofstream 仅用于输出。
fstream 可用于 both/either 输入 and/or 输出。
关键在名字里:
ifstream
= "input file stream" 是istream
或 "input stream" 的一种类型
ofstream
= "output file stream" 是ostream
或 "output stream" 的一种类型
fstream
=“(双向)文件流”,如iostream
(“input/output 流”),如 includes both aspects 通过继承
这是 class 层次结构的样子:
处理文件处理的三个 classes 是:
basic_ifstream
basic_ofstream
basic_fstream
ifstream
、ofstream
和 fstream
是“char
” template specializations 这意味着它们只是 basic_ifstream<char>
、basic_ofstream<char>
和 basic_fstream<char>
即它们处理从文件中读取和写入 char
s。
ifstream
是允许您读取文件内容的输入文件流。ofstream
是输出文件流,允许您将内容写入文件。fstream
默认允许读取和写入文件。但是,您可以通过传入ios::open_mode
标志让fstream
表现得像ifstream
或ofstream
。
ios::openmode
标志
打开模式标志是:
Flag | Description |
---|---|
ios::app |
All write operations must occur at the end of the file |
ios::binary |
Open in binary mode |
ios::in |
Open for reading |
ios::out |
Open for writing |
ios::trunc |
Empty the contents of the file after opening |
ios::ate |
Go to the end of the file after opening |
这些标志是可加的,这意味着您可以使用按位或 |
运算符组合多个标志。如果我想以二进制模式打开文件并追加,我可以按如下方式组合标志:
ios::binary | ios::app
ifstream
始终设置了ios::in
标志,并且无法将其删除。类似地,ofstream
始终设置了ios::out
标志,并且无法将其删除。添加的任何其他标志将与ifstream
的ios::in
和ofstream
的 - 另一方面,如果您不向
fstream
传递任何标志,则默认值为ios::in | ios::out
,因此您可以读取和写入文件。但是如果你明确地为fstream
指定一个标志,比如ios::in
,它将只为阅读而打开,就像ifstream
.
ios::out
组合
如何传递标志?
您可以在构造函数中或调用时这样做 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
只会发生写入。