博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么可以用while(cin)?
阅读量:6863 次
发布时间:2019-06-26

本文共 1719 字,大约阅读时间需要 5 分钟。

/** *  @brief  The quick-and-easy status check. * *  This allows you to write constructs such as *  "if (!a_stream) ..." and "while (a_stream) ..."*/operator void*() const{ return this->fail() ? 0 : const_cast
(this); }

如果你把一个basic_ios类的对象(cin就是)放到if语句的括号里,它就会被转换成void*型。如果输入失败的话,就会得到一个空指针(也就是0),那么if语句就不能通过。

#include
#include
using namespace std;int main(){ int i; do   {
cout<
<
>i);}

首先输出个0.之后输入X,输出X;当输入ctrl+d时,没有输出,结束。

#include
#include
using namespace std;int main(){ int i; do{ cin>>i; cout<
<

输入x,输出x;当输入ctrl+d时,再输出个上一次的输入量,结束。

ctrl+d表示表示输入错误。

cin.clear()可以重新将cin置为有效。

 

导致循环终止的原因是流对象cin进入错误状态:系统输入级故障;读入了无效数据;遇到文件结束符。

下面是一个用到cin判断作为循环条件的程序:

#include
#include
#include
#include
using namespace std;int main(){ map
< pair
> > family; pair
pa; string surName,childName,birthDate; do{ cout<<"enter surname"<
>surName; if(!cin) break;                     //如果cin无效,跳出循环 vector< pair
> child; pair
> >::iterator,bool> ret = family.insert(make_pair(surName,child)); cout<<"input name and age"<
>surName>>birthDate) { pair
pa; pa = make_pair(surName,birthDate); ret.first->second.push_back(pa);     //ctrl+d跳出循环,此时cin无效 } cin.clear();           //使cin重新有效,以达到下面while循环条件。 }while(cin); cout<<"enter search"<
>surName; map
< pair
> >::iterator it = family.find(surName); if(it==family.end()) cout<<"no this surname"<
>::iterator itt = it->second.begin(); while(itt!=it->second.end()) { cout<<(*itt).first<<"\t\t"<<(*itt).second<

转载于:https://www.cnblogs.com/propheteia/archive/2012/07/24/2607091.html

你可能感兴趣的文章