C++基础系列:输入输出流条件状态问题

来源:互联网 发布:启用视频网络 netgear 编辑:程序博客网 时间:2024/06/16 10:30

写入若干个数据,再进行后续操作:

string str[100];int pair_length = 0;while (getline(cin, str[pair_length])    ++pair_length;do_something();int A;cin >> A;do_sth_else();

想要读入未知数个数据,可以使用while循环来实现,在输入文件结束符(EOF,end-of-file)(windows 中为ctrl+z)时,会结束循环。
如上述例子,用cin读入字符串,则可以输入任意多个字符串,getline()即每次读入一行,以换行符为分割,最后想要停止读入字符串则输入ctrl+z即可。

本意是想读入不定个数个字符串并保存,使用while循环实现,写入完字符串后键入文件结束符EOF结束循环进行后续处理,处理完后再根据输入的值(例如一个int)进行相关操作。
而实际上运行时,cin >> A;并不能正常运行。

分析:
IO操作,在错误输入或输入EOF后流会进入错误状态。
一个流若进入错误状态,则其后所有IO操作都会失败。
while循环中为了结束循环而键入EOF后,strm::eofbit置位,表示流达到了文件结束,cin进入错误状态,所以无法写入int A。

为了避免流处于错误状态而程序出错,在使用一个流之前应该确认它是否处于良好状态。
s.good()返回流的有效状态,只有在流处于无错状态时(s.good()==true)才能读取写入数据。
更常见的一种方法是直接将流作为条件来使用。

IO流的条件状态可以检测或设置的,IO库定义了iostate类型,这个位集合表示流的相关状态。

s.eof() 可以检测eofbit,若置位则返回true,EOF时,eofbit和failbit都会被置位s.fail() failbit或badbit置为都会返回true,表示当前状态流不可用s.bad() badbit置位返回trues.good() 和fail相反,若true则表示流可用

回到上述例子中:
写入完字符串后键入文件结束符EOF后,cin.good()==false,后续cin不能用了,如果后面还想继续读入,可以调用cin.clear()。
无参数版的s.clear()会复位所有错误标志位,此时cin.good()==true。
带参数的s.clear(flags)可以复位指定的flags标志位。

原创粉丝点击