第八章 IO库
书的8-12章都在讲标准库
C++对IO设备进行了抽象,以流的方式看待数据在程序和文件、控制台(外设)的流转
本章讲基本内容,14、17章会继续丰富这一章的内容
8.1 IO类
熟记上面的表格,基本流分为三部分:普通流、文件流、string流
标准库通过继承使得它们的使用方式基本相同
IO对象不能拷贝和赋值
所以,流一般以引用的方式出现而不是一般类型或const引用(因为不允许拷贝且流经常被更改)
IO条件状态
这4个状态位~bit写在ios_base.h里
流一旦出错,读写操作立即失效
setstate置位,表示发生了对应错误;clear复位,清楚错误标志位
下面是使用示例
- 练习8.1
管理输出缓冲
除了endl还有flush和ends可以刷新缓冲区
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
逐步构造输出最后一起输出时可以用这个类,尤其是不同类型的数据
第八章结束