/** * @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<basic_ios*>(this); }
如果你把一個basic_ios類的對象(cin就是)放到if語句的括號里,它就會被轉換成void*型。如果輸入失敗的話,就會得到一個空指針(也就是0),那么if語句就不能通過。
#include<iostream> #include<utility> using namespace std; int main() { int i; do
{ cout<<i<<endl; }while(cin>>i); }
首先輸出個0.之后輸入X,輸出X;當輸入ctrl+d時,沒有輸出,結束。
#include<iostream> #include<utility> using namespace std; int main() { int i; do{ cin>>i; cout<<i<<endl; }while(cin); }
輸入x,輸出x;當輸入ctrl+d時,再輸出個上一次的輸入量,結束。
ctrl+d表示表示輸入錯誤。
cin.clear()可以重新將cin置為有效。
導致循環終止的原因是流對象cin進入錯誤狀態:系統輸入級故障;讀入了無效數據;遇到文件結束符。
下面是一個用到cin判斷作為循環條件的程序:
#include<iostream> #include<utility> #include<vector> #include<map> using namespace std; int main() { map<string,vector< pair<string,string> > > family; pair<string,string> pa; string surName,childName,birthDate; do{ cout<<"enter surname"<<endl; cin>>surName; if(!cin) break; //如果cin無效,跳出循環 vector< pair<string,string> > child; pair<map<string,vector<pair<string,string> > >::iterator,bool> ret = family.insert(make_pair(surName,child)); cout<<"input name and age"<<endl; while(cin>>surName>>birthDate) { pair<string,string> pa; pa = make_pair(surName,birthDate); ret.first->second.push_back(pa); //ctrl+d跳出循環,此時cin無效 } cin.clear(); //使cin重新有效,以達到下面while循環條件。 }while(cin); cout<<"enter search"<<endl; cin.clear(); cin>>surName; map<string,vector< pair<string,string> > >::iterator it = family.find(surName); if(it==family.end()) cout<<"no this surname"<<endl; else { vector< pair<string,string> >::iterator itt = it->second.begin(); while(itt!=it->second.end()) { cout<<(*itt).first<<"\t\t"<<(*itt).second<<endl; itt++; } } return 0;
}
