《C++ Primer》读书笔记第八章-2-文件输入输出 And string流

笔记会持续更新,有错误的地方欢迎指正,谢谢!

文件输入输出

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

  1. ifstream:从一个给定文件读取数据;
  2. ofstream:向一个给定文件写入数据;
  3. fstream:读写都行。

fstream特有:打开文件绑定流的open()、关闭绑定文件的close()、文件是否成功打开且尚未关闭的is_open()。
因为fstream是继承自iostream的,所以它拥有iostream所有的行为,而且它还定义了一些新的成员来管理与流关联的文件。下面我们不会介绍~

string流

类型作用
istringstream从string中读取数据
ostringstream向string写入数据
stringstream读写都行

使用istringstream

例子:整理通讯录

事情是这样的,我们有一个通讯录,列出了人名和手机号码,某些人的手机号码可能有多个,像下面这个样子:

爸爸 13525684953
孙子 13624586352 15632459865
先定义一个结构来描述数据(人名和手机号码):

struct PersonInfo
{
  string name;//人名
  vector<string> phones;//此人名可能对应多个号码
};

先创建一个装PersonInfo类型对象的vector容器,再在一个循环中处理输入数据,每个循环读取一条记录(此记录有一个人名和此人的若干电话号码),先提取出一个人名,再提取出若干电话号码:

string line, word;
vector<PersonInfo> people;
while(getline(cin, line))//一次循环输入一行数据到line
{
  PersonInfo info;//创建一个PersonInfo类的对象
  istringstream record(line); //将 记录record 绑定到 刚读入的那行数据
  record >> info.name; //从记录record中读取名字到 info.name
  while(record >> word) //从记录record中读取号码到 word
  {
      info.phones.push_back(word);//将word压入到 info.phones中
  }
  people.push_back(info); //把这个人的信息info装进通讯录
}

这个小程序很棒,实现了 从一行行的字符串 转换为 人名和其电话号码分离的通讯录 的功能,不理解的地方多看看。

使用ostringstream

现在我们把刚刚构建好的通讯录输出,因为我们不希望输出号码有错误的人。所以,对于每一个人来说,我们要验证他所有的号码都有效才可以输出。于是,我们就想到先把输出内容写入到一个内存ostringstream中:

for(const auto &entry : people) //遍历。entry是people的引用。
{
    ostingstream goodNums, badNums; //每步循环创建这对 对象,用于装正确、错误的情况。
    for(const auto &nums : entry.phones)//循环此人的全部电话号码
    {
        if(!valid(nums)) //如果号码不合法(我们假定有这个valid函数)
        {
            badNums << " " << nums;
        }
        else
        {
            goodNums << " " << nums;
        }
    }
    if(badNums.str().empty()) //没错误号码,就输出此人名字和其全部号码。
    {
        os << entry.name << " " << goodNums.str() << endl; 
    }
    else//有一个或以上的错误号码,就输出此人名字和错误的号码。
    {
        cerr << "有错误号码" << entry.name << badNums.str() << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值