8.1 标准库定义的IO类型
-
iostream 定义了用于读写流的基本类型
-
fstream 定义了读写命名文件的类型
-
sstream 定义了读写内存string对象的类型
-
对于宽字符,类型和函数的名字都以 w 开头,
wcin/wcout/wifstream/wofstream
-
IO对象拷贝和赋值
ofstream out1,out2; out1=out2; //错误,不能对流对象赋值 ofstream print(ofstream) //错误,不能初始化ofstream参数 out2=print(out2); //错误不能拷贝流对象
-
由于不能拷贝IO对象,因此不能将形参和返回值类型设为流类型,进行IO操作的函数通常以引用方式传递和返回流 ,读写一个流会改变其状态,所以不能使用const
8.2 条件状态
- 一个流一旦发生错误,其上后续IO操作都会失败,故通常在使用一个流之前要检查其状态
- badbit 系统级错误,无法再使用(badbit置位,failbit也置位)
- failbit 可恢复错误,可以修正,流可以继续使用
- eofbit 文件末尾,failbit也要置位
- goodbit 流未发生错误
- 返回流当前状态
s.rdstate
8.3 管理输出缓冲
-
导致缓冲刷新的原因
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
- 缓冲区满时
- 使用操纵符
endl
显式刷新 - 在每个输出操作后,用操纵符
unitbuf
设置流的内部状态 - 一个输出流可能被关联到另一个流
-
操纵符显式刷新
cout<<"hi"<<endl; //输出hi,换行,刷新 cout<<"hi"<<flush; //输出,刷新,不附加字符 cout<<"hi"<<ends; //输出,附加一个空字符,刷新
-
unitbuf
操纵符cout<<unitbuf; //所有输出操作都会立刻刷新缓冲区 cout<<nounitbuf; //回到正常的刷新缓冲方式
-
程序崩溃,缓冲区将不会被刷新
8.4 关联输入输出流
-
tie
- 不带参数,返回指向输出流的指针
- 带一个
ostream
指针,将对象关联到该ostream
上
cin.tie(&cout); //cin和cout关联 ostream *old_tie=cin.tie(nullptr); //cin不再与其他流关联
8.5 文件流
-
文件输入输出流
- ifstream 从给定文件读取数据
- ofstream 向给定文件写如数据
-
使用文件流
ifstream in(filename); //构造一个文件流对象并打开给定文件
-
文件模式
- app 写操作,定位到文件末尾,追加内容
- ate 打开文件后定位到文件末尾
- out 以写方式打开,已有数据会被覆盖
8.6 string流
- istringstream 从string 读取数据
- 用法:读取文件内容时,先读取一行,构造string流,再读取各个成员/字段