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

ifstreamofstreamfstream 是“chartemplate specializations 这意味着它们只是 basic_ifstream<char>basic_ofstream<char>basic_fstream<char> 即它们处理从文件中读取和写入 chars。

  • ifstream 是允许您读取文件内容的输入文件流。
  • ofstream 是输出文件流,允许您将内容写入文件。
  • fstream 默认允许读取和写入文件。但是,您可以通过传入 ios::open_mode 标志让 fstream 表现得像 ifstreamofstream

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 标志,并且无法将其删除。添加的任何其他标志将与 ifstreamios::inofstream
  • 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

基本上可以永远不使用 ifstreamofstream,而总是使用带有所需标志的 fstream。但是在设置标志时很容易出现意外错误。因此,使用 ifstream 可以确保永远不会发生写入,而使用 ofstream 只会发生写入。