Aru*_*run 15 c++ file-io stream
为了在C++中执行文件IO,我们使用ofstream,ifstream和fstream类.
将文件与流对象相关联的过程称为"打开文件".打开文件时,我们可以指定打开文件的模式.我的查询与ios::out和ios:in模式有关.
当我创建一个ofstream对象并用ios::in模式打开文件时,我能够写入文件,但只有当它已经创建时(如果ios::out模式文件尚不存在,也会创建模式文件).
但是当我创建ifstream对象并使用ios::out模式打开文件时,我能够从文件中读取.
我的问题是当流的类型(/ )本身指定正在执行哪种类型的操作(输入/输出)时,为什么这些模式(ios::in/ ios::out)由语言提供?ifstreamofstream
另外,为什么这种模糊的用法(ofstream有ios::in和ifstream有ios::out)在一种情况下有效并且在另一种情况下失败(尽管只有文件不存在)?
ybu*_*ill 12
的ofstream,ifstream和fstream类的下属高级接口filebuf,其中一个可以通过得到rdbuf()的流的成员函数.
根据标准,当你打开一个ofstream模式mode,它打开下划线流缓冲区,如同mode | ios_base::out.类似地ifstream使用mode | ios_base::in.fstream将mode参数逐字传递给下划线流缓冲区.
以上含义是以下代码打开具有完全相同的打开标志的文件:
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)