第八章 IO库

第八章 IO库

书的8-12章都在讲标准库

C++对IO设备进行了抽象,以流的方式看待数据在程序和文件、控制台(外设)的流转

本章讲基本内容,14、17章会继续丰富这一章的内容

8.1 IO类

熟记上面的表格,基本流分为三部分:普通流、文件流、string流

标准库通过继承使得它们的使用方式基本相同

IO对象不能拷贝和赋值

所以,流一般以引用的方式出现而不是一般类型或const引用(因为不允许拷贝且流经常被更改)

IO条件状态

这4个状态位~bit写在ios_base.h里

流一旦出错,读写操作立即失效

setstate置位,表示发生了对应错误;clear复位,清楚错误标志位

下面是使用示例

  • 练习8.1

管理输出缓冲

除了endl还有flushends可以刷新缓冲区

endl添加换行符,ends添加一个空字符,flush只刷新缓冲区

还可以用unitbuf设置每次输出都刷新缓冲,nounitbuf则使流回到正常设置

tie可以换绑流,但是一般不建议使用

8.2 文件IO

主要指fstream、ifstream、ofstream三个类

fstream继承自iostream,不过也有一些特殊操作:

特殊主要是因为文件流需要绑定具体文件、打开、关闭,和默认绑定到命令行的普通流相比多了一步

使用文件流对象

如果文件流对象不绑定文件,就需要用open和close操作

打开之后一般还需要判断一下是否打开成功,否则逻辑可能有问题

  • 练习8.4

  • 练习8.5

文件模式

这里的mode指的是使用文件的方式

out模式会清除文件内容从头开始写入,阻止清除的方式是指定app

  • 练习8.7

    我就不使用书店程序了,使用练习8.5的小程序练习

  • 练习8.8

8.3 string流

使用istringstream

这个类通常用于处理行内单个字符串

stringstream绑定字符串后再使用(容易被这个输入输出搞混)

  • 练习8.9

  • 练习8.10

  • 练习8.11
struct PersonInfo {
  string name;
  vector<string> phones;
};
int main(int argc, char **argv) {
  string line, word;
  vector<PersonInfo> people;
  istringstream record;
  while (getline(cin, line)) {
    PersonInfo info;
    record.str(line);
    record >> info.name;
    while (record >> word) {
      info.phones.push_back(word);
    }
    people.push_back(info);
    record.clear();
  }
  for (auto x : people) {
    cout << x.name << " " << x.phones[0] << endl;
  }
  // a 123
  // b 321
  // c 11
}

使用ostringstream

逐步构造输出最后一起输出时可以用这个类,尤其是不同类型的数据

第八章结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

+xiaowenhao+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值