ifstream、ofstream 和 fstream 有什么区别? [重复]

问题描述 投票:0回答:3

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

c++ fstream ifstream ofstream
3个回答
17
投票

类层次结构如下所示: 来自 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
旗帜


开放模式标志是:

旗帜 描述
ios::app
所有写操作必须发生在文件末尾
ios::binary
以二进制模式打开
ios::in
开放阅读
ios::out
开放写作
ios::trunc
打开后清空文件内容
ios::ate
打开后转到文件末尾

这些标志是可加的,这意味着您可以使用按位 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
标志,该标志打开一个专门用于写入的文件。如果文件已经存在,则无法打开。


5
投票

ifstream
仅用于输入。

ofstream
仅用于输出。

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


4
投票

关键在于名字:

  • ifstream
    =“输入文件流”,是
    istream
    或“输入流”
  • 的类型
  • ofstream
    =“输出文件流”,这是一种
    ostream
    或“输出流”
  • fstream
    =“(双向)文件流”,如
    iostream
    (“输入/输出流”),如通过继承包括两个方面
© www.soinside.com 2019 - 2024. All rights reserved.