C++ Primer第八章②
C++ Primer
IO库
文件输入输出
头文件fstream定义了三个类型来支持文件IO:
- ifstream:从一个给定文件读取数据
- ofstream:向一个给定文件写入数据
- fstream:读写给定文件
因为fstream是继承自iostream的,所以它拥有iostream所有的行为,而且它还定义了一些新的成员来管理与流关联的文件。下面我们会详细介绍。
使用文件流对象
当我们想要读写一个文件时,可以定义一个文件流对象,把对象和文件关联起来:
ifstream in(ifile); //定义输入流in,初始化它为从文件中读取数据,文件名是ifile
用fstream代替iostream&
我们来用原来书店老板那个Sales_data类试试fstream:
ifstream input(record); //打开销售记录文件,关联到input
ofstream output(out); //打开输出文件
Sales_data total; //保存销售额总量
if(read(input, total)) //读取第一条销售记录
{
Sales_data trans; //保存下一条
while(read(input, trans))
{
if(total.isbn() == trans.isbn())
{
total.combine(trans); //同一条,加上去
}
else
{
print(output, total) << endl; //不同的,输出前一条,刷新缓存
total = trans; //准备搞下一条
}
}
print(output, total) << endl; //打印最后一条
}
else
{
cerr << "没数据啊老板" << endl;
}
大家是不是觉得这段程序跟之前那段非常像,我想告诉的大家的就是,我们用ftream可以像用iostream一样,非常方便。
成员函数open和close
string ifile = "f";
ifstream in(ifile); //构建一个ifstream并打开f文件
ofstream out;
out.open(ifile + "1"); //打开指定文件f1,out与f1关联
if(out) //如果打开成功(文件不能被连续打开)
{
in.close(); //关闭文件f
in.open(ifile + "2"); //打开f2文件
}
else
{
cerr << "文件不存在" << endl;
}
自动构造和析构
当文件流离开它的作用域时,它就自动被销毁了,与它关联的文件也会自动关闭。
文件模式
每个流都有一个关联的文件模式,用来指出如何使用文件: 文件模式 | 含义 ---|--- in | 以读的方式打开 out | 以写的方式打开 app | 每次写操作前定位到文件末尾 ate | 打开文件后立即定位到文件末尾 trunc | 截断文件 binary | 以二进制的方式进行IO
每个文件流类型都定义了一个默认的文件模式,且一个文件流类型可以有多个文件模式,例如:
文件流类型 | 文件模式 |
---|---|
ifstream | in |
ofstream | out |
fstream | in和out |
以out模式打开文件会丢弃已有数据
阻止一个ofstream清空给定文件内容的唯一方法是显示指定app或in模式:
ofstream app("file1", ofstream::app);
ofstream app2("file1", ofstream::out | ofstream::app);
//这样就不会被清空了,定位到文件末尾了嘛
每次调用open时都会确定文件模式
对于一个给定流,每次打开文件,都可以指定其文件模式:
ofstream out; //未指定
out.open("f"); //默认为out和trunc
//接下来改变它的模式
out.close(); //先关闭
out.open("f", ofstream::app); 模式为out和app
每次打开文件,都要设置文件模式,未指定时就使用默认值,你都要清楚的。
#C++工程师#