除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件。我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作:
fstream fstrm;//创建一个未绑定的文件流.fstream是头文件fstream中定义的一个类型
fstream fstrm1(s);//创建一个fstream,并打开名未s的文件.s可以是string类型或者是一个指向c风格字符串的指针.这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
fstream fstrm2(s, mode);//与前一个构造函数类似,但指定mode打开文件
fstrm.open(s);//打开名为s的文件,并将文件与fstrm绑定.s可以是一个string或一个指向c风格字符串的指针.默认的文件mode依赖于fstream的类型.返回void
fstrm.close();//关闭fstrm绑定的文件.返回void
fstrm.is_open();//返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
使用文件流对象:
ifstream in(ifile);//构造一个ifstram并打开给定文件
ofstream out;//输出文件流未关联到任何文件
#include<bits/stdc++.h>
using namespace std;
string filename = "C:\\Users\\xizu_ghq\\Desktop\\pre.txt";
string filename1= "C:\\Users\\xizu_ghq\\Desktop\\out.txt";
int main(){
ifstream file(filename);//打开一个文件,然后输入
ofstream outfile(filename1);
string name;
while(file>>name) outfile<<name<<endl;
file.close();
outfile.close();
return 0;
}
文件模式
每个流都有一个关联的文件模式,用来指出如何使用文件:
in 以读方式打开
out 以写方式打开(以out打开的文件隐含被截断,要使不被截断,就要同时指定app模式。)
app 每次写操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件(也就是:如果打开的文件存在,其内容将被丢弃,其大小被截断为零)
binary 以二进制方式进行IO
- 指定文件模式有如下限制:
1.只可以对 ofstream 或 fstream 对象设定 out 模式。
2.只可以对 ifstream 或 fstream 对象设定 in 模式。
3.只有当 out 也被设定时才可以设定 trunc 模式。
4.只要 trunc 没被设定,就可以设定 app 模式。在 app 模式下,即使没有显示指定 out 模式,文件也总是以输出方式被打开。
5.默认情况下,即使我们没有指定 trunc,以 out 模式打开的文件也会被截断。为了保留以 out 模式打开的文件内容,我们必须同时指定 app 模式,这样才会以追加的模式写到文件末尾:或者同时指定 in 模式,即打开文件同时进行读写操作。
6.ate 和 binaty 模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。ifsream 关联的文件默认以 in 模式打开,ofstream 关联的文件默认以 out 模式打开,fstream 关联的文件默认以 in 和 out 模式打开。
#include<bits/stdc++.h>
using namespace std;
int main(){
//三个打开文件,但是不能保留文件内容的打开方式
ofstream out1("C:\\Users\\xizu_ghq\\Desktop\\pre.txt");//打开并截断文件
ofstream out2("C:\\Users\\xizu_ghq\\Desktop\\pre.txt",ofstream::out);//同上,隐含的截断文件。
ofstream out3("C:\\Users\\xizu_ghq\\Desktop\\pre.txt",ofstream::out | ofstream::trunc);
//为了保留文件内容,显式指定app模式
ofstream app1("C:\\Users\\xizu_ghq\\Desktop\\pre.txt",ofstream::app);//隐含的输出模式
ofstream app1("C:\\Users\\xizu_ghq\\Desktop\\pre.txt",ofstream::app|ofstream::out);//输出模式+追加模式
return 0;
}
注意:保留ofstream打开文件中已有数据的唯一方法是同时指定in或者app模式
#include<bits/stdc++.h>
using namespace std;
int main(){
ofstream out;
out.open("C:\\Users\\xizu_ghq\\Desktop\\pre.txt");//默认指定out+trunc
out.close();
out.open("C:\\Users\\xizu_ghq\\Desktop\\pre.txt",ofstream::app);//保留已有数据
return 0;
}