作者:马志峰
链接:https://zhuanlan.zhihu.com/p/24100020
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://zhuanlan.zhihu.com/p/24100020
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:
- 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
- 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
- 本文仅作学习交流使用,禁止任何形式的转载
正文
IO
- 设备IO
- iostream头文件
- fstream头文件
- 内存IO
- sstream头文件
iostream头文件
- istream, wistream 从流读取
- ostream, wostream 向流写入
- iostream, wiostream 读写
另外两个有类似的结构,三者之间存在继承关系
IO对象作为形参或返回类型时,通常使用非const引用类型,因为:
- IO对象不允许拷贝
- 读写一个IO对象会改变其状态,因此不能是const
流的状态
- 一个类型
- 四个数据成员
- 四个流状态函数
- 四个位状态函数
一个类型
strm::iostate 是一种类型,用来表达流的状态,支持位运算
四个流状态函数
- s.rdstate() 返回流的当前状态,类型为iostate
- s.setstate(flags) 设置流的状态,flags的类型为iostate
- s.clear(flags) 将给定位的状态复位,flags的类型为iostate
- s.clear() 复位所有
四个数据成员
表示四种不同的流状态,分别是iostate中的某一位
- strm::badbit 表示流崩溃
- strm::failbit 表示IO操作失败
- strm::eofbit 表示到达文件尾
- strm::goodbit 表示流未出错
四个位状态函数
获取对应位的状态
- s.eof()
- s.fail()
- s.bad()
- s.good()
对于前三个来说,若对应位被置位,则返回true
对于good()来说,若流处于有效状态,则返回true
示例
cin.clear( cin.rdstate() & ~cin.failbit & ~cin.badbit );
复位failbit和badbit,其他位不变
while( cin>>num ){}
while循环检查>>表达式返回的流的状态,流保持有效状态时,条件为真
int num;
cin >> num;
期望读入一个整数,若输入“Boo”,遇到字符B时流就进入了错误状态,后面的输入都会失效
管理输出缓冲
每个输出流都管理一个缓冲区, 用来保存程序读写的数据
os<<"xxx";
字符串有可能立即打印,也有可能被保存到缓冲区随后打印
下列情况下,缓冲区将被强制刷新
- 程序结束
- 缓冲区满
- endl或其它操纵符
- os<<unitbuf,设置后的流不再缓冲,直接输出
- 关联流
- endl 插入换行符并刷新缓冲区
- ends 插入空字符并刷新缓冲区
- flush 刷新缓冲区
标准库中的cin和cout是关联在一起的,使用cin时将导致cout的缓冲区被刷新
可以使用tie函数设定关联