為什么可以用while(cin)?


/**
 *  @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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM