8.1.1 IO

IO对象无拷贝或赋值。进行IO操作的函数通常以引用的方式传递和返回流,且该引用不能是const的
确定一个流对象是否处于良好状态的最简单的方法是将它作为一个条件来使用
while (cin >> word)//只有当按下回车才会开始读取输入流,然后依次处理流中的数据,处理完之后(如果流中没有错误数据或文件结束标识),等待下次流的输入,按下回车后读取流,直到遇到错误数据或文件结束标识则结束cin流。


        流的状态就像汇编里的标志寄存器,用给特定的二进制位置位来反馈对应状态。
        如果到达文件结束或流读取结束位置,eofbit和failbit都会被置位,badbit、eofbit、failbit被置位时,failbit都会被置位。
badbit表示系统及错误,如不可回复的读写错误。通常情况下,一旦badbit被置位,流就无法使用了。在发生可恢复错误后,failbit被置位,如期望读取熟知却读取出一个字符等错误。
goodbit在所有错误位均未置位时返回true.若到达文件末尾,即使将流标志位全部复位,也不能再输出数据。
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);//将failbit和badbit复位,但保持eofbit不变。 Cin.rdstate()表示当前流的标志位状态,~failbit表示将cin流的badbit位置0,其他位均值1,~cin.failbit表示将cin流的failbit 位置0,其他位置1,将三者按位取与,即可达到预期的效果。(cin.failbit表示将cin流的failbit位置1,其他位置0)

cin.ignore(100,' ')
• 作用是把你“按回车“之前的输入从缓冲区内清除,保证对下次的Cin没影响。忽略回车前的前100个字符,从上一次流的读取位置开始算。
• 或者大于100个字符的输入也被清除。
刷新缓冲区就是数据真正写到输出设备或文件
刷新条件:缓冲区满了,endl,flush, ends, unitbuf等操作符
 endl换行后刷新缓冲区,flush刷新缓缓冲区,ends输出一个空格后刷新缓冲区。
unitbuf在每次输出操作后都进行一次flush刷新,而nounitbuf则恢复正常的缓冲区刷新机制。Cout << unitbuf; cout << nounitbuf;
如果程序异常终止,输出缓冲区是不会被刷新的。
当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。标准库将cout和cin关联在一起,因此下面语句:cin >> ival导致cout的缓冲区被刷新,也就是当前输入缓冲区内所有内容都将被输出。
 

原文地址:https://www.cnblogs.com/hi3254014978/p/12373465.html