C++文件流打开模式模糊

Aru*_*run 15 c++ file-io stream

为了在C++中执行文件IO,我们使用ofstream,ifstream和fstream类.

  • ofstream:Stream类写入文件
  • ifstream:用于从文件中读取的Stream类
  • fstream:Stream类,用于读取和写入文件

将文件与流对象相关联的过程称为"打开文件".打开文件时,我们可以指定打开文件的模式.我的查询与ios::outios:in模式有关.

当我创建一个ofstream对象并用ios::in模式打开文件时,我能够写入文件,但只有当它已经创建时(如果ios::out模式文件尚不存在,也会创建模式文件).
但是当我创建ifstream对象并使用ios::out模式打开文件时,我能够从文件中读取.

我的问题是当流的类型(/ )本身指定正在执行哪种类型的操作(输入/输出)时,为什么这些模式(ios::in/ ios::out)由语言提供?ifstreamofstream

另外,为什么这种模糊的用法(ofstreamios::inifstreamios::out)在一种情况下有效并且在另一种情况下失败(尽管只有文件不存在)?

ybu*_*ill 12

ofstream,ifstreamfstream类的下属高级接口filebuf,其中一个可以通过得到rdbuf()的流的成员函数.

根据标准,当你打开一个ofstream模式mode,它打开下划线流缓冲区,如同mode | ios_base::out.类似地ifstream使用mode | ios_base::in.fstreammode参数逐字传递给下划线流缓冲区.

以上含义是以下代码打开具有完全相同的打开标志的文件:

fstream f("a.txt", ios_base::in | ios_base::out);
ifstream g("a.txt", ios_base::out);
ofstream h("a.txt", ios_base::in);
Run Code Online (Sandbox Code Playgroud)

在这些行之后,您可以使用和完成相同的操作f.rdbuf(),g.rdbuf()并且h.rdbuf(),并且所有这三个操作就好像您使用C调用打开文件一样fopen("a.txt", "r+"),它提供读/写访问权限,不截断文件,如果文件执行操作则失败不存在.

那么,为什么我们有三个不同的类?正如我已经说过的,这些是高级类,在低级流缓冲区上提供高级接口.这个想法是ifstream具有输入的成员函数(如read()),ofstream具有输出的成员函数(如write())同时fstream具有两者.例如,你不能这样做:

g.write("abc", 3); // error: g does not have a write function
Run Code Online (Sandbox Code Playgroud)

但是这很有效,因为虽然g是一个ifstream,但我们用它开了它ios_base::out:

g.rdbuf()->sputn("abc", 3); // we still have write access
Run Code Online (Sandbox Code Playgroud)