8.1 IO类
头文件 | 类型 |
---|---|
iostream | (w)istream, (w)ostream, (w)iostream |
fstream | (w)ifstream, (w)ofstream, (w)fstream |
sstream | (w)istringstream, (w)ostringstream, (w)stringstream |
IO类型之间的关系——继承关系
IO对象无拷贝或赋值,进行IO 操作的函数通常通过引用方式传递和返回流
条件状态:
确定一个流对象最简单的方法是将它作为一个条件使用
eg:while(cin>>word)//输入操作成功,条件为正
查询流的状态
4个iostate类型的constexpr值:
- badbit:表示系统级错误,流已崩溃——bad()
- failbit:表示一个IO操作失败,可修正,流可继续使用——fail():在badbit被置位时也返回true
- eofbit:到达文件结束,此时failbit也会被置位——eof()
- goodbit:值为0表示未发生错误——good()
—>bad,fail,eof,有对应错误返回true,所有错误位均未置位,good返回true
—>good和fail可确定流的总体状态,eof和bad只能表示特定的错误
管理流的状态
- rdstate() 返回当前流状态,返回iostate,(下列函数均返回void)
- setstate(flags) 将给定条件置位
- clear() 清除所有标志位
- clear(falgs) 接受一个iostate值,表示流的新状态
//复位failbit和badbit
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
管理输出缓存
- 程序正常结束
- 缓存区满
- 使用操作符:endl(先换行,后刷新),ends(先空个格),flush(人狠话不多,上来直接刷)
- 使用unitbuf设置流的内部状态(cerr默认设置unitbuf)
cout<<unitbuf;//此后所有输出都立即刷新
cout<<nounitbuf;//回到正常- 一个输出流被关联到另一个输入流(默认cin和cerr都关联到cout,所以读cin或cerr都会导致cout刷新缓存)
ostream * old_tie=cin.tie()/*不带参数,返回指向其关联输出流的指针,若无关联流,返回空指针*/
cin.tie(&cout)//带参数的
cin.tie(nullptr)//cin不再和其他流关联
!:如果程序崩溃,输出缓存区不会被刷新