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标志位。
- C++基础系列:输入输出流条件状态问题
- C++:IO流条件状态
- [C++STDlib基础]IO输入输出流概述
- 输入输出流状态
- C缓冲区(输入输出问题)
- c文件的输入输出,基础
- c++primer 第八章IO操控流的条件状态
- Java基础:输入输出流
- Java基础:输入输出流
- C/C++输入输出流
- C++STL输入输出流
- C ++ 输入输出流
- [C++]输入输出流
- C文件输入输出流
- 【C#】VS2010的Helloworld,输入输出、条件、循环、数组、类
- C语言基础--条件编译
- C语言基础 输入输出字符型变量
- (一)C语言基础(基本数据类型,输入输出)
- Imageloader简单展示Listview
- leetcode237
- 团队日志四
- Git笔记
- leptonica(一)vs2017编译源码
- C++基础系列:输入输出流条件状态问题
- TCP初探
- java学习资源整理
- PHP和golang实现设计模式-抽象工厂模式
- base的作用于测试
- Zookeeper集群安装
- 详解zabbix安装部署(Server端篇)
- Swift【App版本更新】
- select 标签重置