ifstream、ofstream和fstream有什么区别?

4
在文件处理中,我碰到了 ifstream、ofstream 和 fstream。能否有人告诉我它们之间的主要区别?

ifstreamofstreamfstream - Enlico
使用 ifstream、ofstream 和 fstream。说明:这是一个 Stack Overflow 上的链接,包含关于 C++ 文件输入输出的问题。 - Enlico
3个回答

19
这是类层次结构的样子: 来源:https://www.cplusplus.com/img/iostream.gif 处理文件的三个类是:
  • basic_ifstream
  • basic_ofstream
  • basic_fstream
ifstreamofstreamfstream是“char”的特化模板,这意味着它们实际上就是basic_ifstream<char>basic_ofstream<char>basic_fstream<char>,即它们用于从文件中读取和写入char
  • ifstream 是输入文件流,允许您读取文件的内容。
  • ofstream 是输出文件流,允许您将内容写入文件。
  • fstream 默认允许从文件中读取和写入。但是,您可以通过传入 ios::open_mode 标志,使 fstream 表现得像 ifstreamofstream

ios::openmode 标志


打开模式标志如下:

标志 描述
ios::app 所有写操作必须发生在文件末尾
ios::binary 以二进制模式打开
ios::in 以读取模式打开
ios::out 以写入模式打开
ios::trunc 打开文件后清空文件内容
ios::ate 打开文件后定位到文件末尾

这些标志是可叠加的,这意味着您可以使用按位或 | 运算符组合多个标志。如果我想以二进制模式打开文件并进行追加操作,可以按以下方式组合标志:

ios::binary | ios::app
  • ifstream总是设置了ios::in标志,且无法移除。同样地,ofstream总是设置了ios::out标志,且无法移除。添加的其他标志将与ifstreamios::inofstreamios::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只会进行写入操作。

编辑(ios::noreplace

C++ 23添加了ios::noreplace标志,它专门用于以独占方式打开文件进行写入。该标志在某些实现中已经存在,但现在在C++ 23中已经标准化。如果文件已经存在,则无法打开。


1
最后一句话应该修改为类似这样的内容: 因此,使用ifstream,您可以确保读取将始终启用,无论是否使用任何掩码。类比地,对于ofstream,写入将始终启用。 - Artur Opalinski

5

ifstream 仅用于输入。

ofstream 仅用于输出。

fstream 可以用于输入和/或输出。


4

关键在于命名:

  • ifstream = "输入文件流",它是 istream 或 "输入流" 的一种类型
  • ofstream = "输出文件流",它是 ostream 或 "输出流" 的一种类型
  • fstream = "(双向) 文件流",就像 iostream ("输入/输出流") 一样,通过继承包含了两个方面

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