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

来源:互联网 发布:第三代火影 知乎 编辑:程序博客网 时间:2024/06/03 12:52

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

文件输入输出

头文件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
原创粉丝点击