
1、标准库定义了四个IO对象。
(1)、我们可以用一个名为cin的istream类型的对象来处理输入,这个对象也叫标准输入
(2)、可以用ostream类型的对象cout,称作标准输出
(3)、另外两个ostream对象:cerr输出警告和错误消息,clog输出程序运行时的一般信息
2、IO库类型和头文件
| iostream从流中读写 | fstream从文件读写 | sstream从string中读写 |
| istream | ifstream | istringstream |
| ostream | ofstream | ostringstream |
| iostream | iofstream | iostringstream |
3、为了使用宽字符的语言,标准库定义了一组类型和对象 *** 纵wchar_t类型的数据,宽字符版本就是在普通的char版本前加上w,例如wcin,wcout
4、标准库使我们能忽略这些不同的类型的流之间的差异,这是通过继承机制来实现的,如ifstream和istringstream都继承自istream,我们都可以对其使用>>
二、使用IO对象1、IO对象无拷贝和赋值,因此不能将其作为普通形参或返回类型,只能以引用的方式进行传递
2、IO类定义了一些函数和标志,帮助我们访问和 *** 纵流的条件状态
//此处strm代表一种IO类型,下面四个代表一种状态
strm::badbit //指出流已崩溃
strm::failbit //支持一个IO *** 作失败了
strm::eofbit //指出流到达了文件结束
strm::goodbit //指出流未处于错误状态
s.eof() //若流s的eofbit置位,即文件末尾,则返回true
s.fail() //若流s的failbit或badbit置位,则返回true
s.bad() //若流s的badbit置位,则返回true
s.good() //若流s处于有效状态,则返回true
s.clear() //将流s的所有条件状态复位,将流的状态设置为有效,返回void
s.clear(flags) //将流s的对应条件状态复位
s.setstate(flags) //设置流s的对应条件状态
三、管理输出缓冲
1、每个输出流都管理一个缓冲区,用来保存程序和数据的读写,例如当我们输出一个串时,可能立即被打印出来,也可能先保存在缓存区,随后打印。有了缓冲机制, *** 作系统就可以将程序的多个输出 *** 作组合成单一的系统级写 *** 作,可以带来很大的性能提升
2、导致缓冲区刷新(该输出的东西都输出)的原因可能有:
(1)、程序正常结束,缓冲刷新作为main的return的一部分
(2)、缓冲区满时刷新
(3)、用 *** 纵符如endl、flush、ends显式刷新。endl换行并刷新缓冲区;flush刷新不会额外输出;ends向缓冲区插入空字符并刷新
(4)、输出 *** 作之后可用 *** 纵符unitbuf设置流的内部状态,来清空缓存区。默认时cerr时unitbuf的,即cerr的内容立即刷新
cout << unitbuf; //之后的所有cout输出都将立即刷新缓冲
cout << nounitbuf; //恢复cout的默认刷新
(5)、一个输出流可能被关联到另一个流。读写被关联的流时,关联到的流的缓冲被刷新。例如,cin和cerr关联到cout,故读cin或写cerr都将使cout刷新
3、当一个输入流被关联到一个输出流时,任何试图从读入流读取数据的 *** 作都会先刷新输出流,例如标准库已经将cout和cin关联在一起,每次cin都会刷新cout的缓冲区
4、我们可以用tie成员函数将istream对象与ostream或者ostream与ostream
cin.tie(&cout); //将cin关联到cout
cin.tie(nullptr); //解开关联
5、每一个流同时最多关联到一个流,但是多个流可以同时关联到一个ostream
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)