C++ Primer第八章②

C++ Primer

IO库

文件输入输出

头文件fstream定义了三个类型来支持文件IO:

  1. ifstream:从一个给定文件读取数据
  2. ofstream:向一个给定文件写入数据
  3. 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

每个文件流类型都定义了一个默认的文件模式,且一个文件流类型可以有多个文件模式,例如:

文件流类型 文件模式
ifstreamin
ofstreamout
fstreamin和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++工程师#
全部评论

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务