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++工程师#
全部评论

相关推荐

07-07 17:06
已编辑
深圳技术大学 golang
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务