輸入輸出流相關操作

最近在輸入輸出流上載了好多次,所以看了資料,決定寫下來供大家參考,歡迎指正:

首先明確一點,輸入cin和輸出cout有四個狀態:

  1. godbit   無錯誤 
  2. Eofbit    已到達文件尾 
  3. failbit     非致命的輸入/輸出錯誤 
  4. badbit    致命的輸入/輸出錯誤 
badbit是一些系統底層或者硬件出錯,比如文件系統錯誤,磁盤錯誤,網絡錯誤等;不可恢復
failbit就是其他軟件錯誤,如試圖從不能解析爲整數的字符串裏想要讀一個整數等,eof也會造成failbit被置位;可以恢復,一般用cin.clear();將cin的標誌位改爲godbit

cin.fail()可以檢測的是badbit和failbit這兩個標誌位。
cin.bad()用來檢測的是badbit標誌位。
可以用下面的代碼來查看狀態位的信息;輸出如下圖:
        cout <<"ios:: failbit:"<< ios:: failbit << endl;
cout <<"ios:: eofbit:"<< ios:: eofbit << endl;
cout <<"ios:: badbit:"<< ios:: badbit << endl; 
cout <<"ios:: goodbit:"<< ios:: goodbit << endl;

圖中各狀態分別爲0、1、2、4。其實就是二進制裏的000、001、010、001。用這三個位來表示輸入輸出流的狀態。
想知道每個標誌位的狀態,可以使用cin.rdstate()函數取得整個標誌變量的值,然後與對應的標誌常量相與就可以獲得對應標誌位的狀態。如下面的代碼:
        cout <<"badbitstate:"<< ( x.rdstate( ) & ios::badbit ) << endl;
cout <<"eofbitstate:"<< ( x.rdstate( ) & ios::failbit ) << endl;
cout <<"eofbitstate:"<< ( x.rdstate( ) & ios::eofbit ) << endl;
經常由於標誌位處於錯誤狀態,所以不能進行輸入就直接跳過,比如下面的代碼:
void main () 

     int a,b; 
     cin>>a>>b;
cout<<a<<b<<endl; 
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin>>a>>b;
cout<<a<<b<<endl; 
}
當輸入正確時,標誌位爲0,第五行可以繼續進行輸入;

當輸入錯誤時,標誌位狀態爲1,這裏是因爲輸入類型不是int型,所以產生failbit ,非致命的輸入/輸出錯誤 ,讀者可以根據上面的方式進行驗證。
函數沒有在第五行重新輸入,直接退出。

首先我們利用上面所提到的用cin.clear()來將cin的標誌位改爲godbit,如下:

void main () 
     int a,b; 
     cin>>a>>b;
cout<<a<<b<<endl; 
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin.clear();
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin>>a>>b;
cout<<a<<b<<endl; 
}
加上cin.clear();後可以看到標誌位狀態已經恢復正常,但是還是沒有進行輸入,而是直接退出了。這裏是因爲,q w沒有讀入到a b中,它們還在緩衝流裏面,需要將其清除。



void main () 

         int a,b; 
char ch,ch1,ch2;
         cin>>a>>b;
cout<<a<<b<<endl; 
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin.clear();
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin.get(ch);
cin.get(ch1);
cin.get(ch2);
cout<<ch<<" "<<ch1<<ch2;
cin>>a>>b;
cout<<a<<b<<endl; 
}
我用char類型變量把緩衝區字符取出然後輸出後,下面的cin可以正常使用了。
切記,在上面我用了三個cin.get(),是因爲除了q和w,還有一個回車符在流裏面,必須將其取出。
按理說ch2應該爲換行符,但是我輸出並沒換行,也沒有任何顯示,這裏有點疑惑??

也可以使用fflush(stdin);或者cin.sync();直接清空緩衝區,(兩個效果類似)來進行重新輸入,代碼如下:

void main () 
     int a,b; 
//char ch,ch1,ch2;
     cin>>a>>b;
cout<<a<<b<<endl; 
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
cin.clear();
cout<<"標誌位狀態爲:"<<cin.fail()<<endl;
fflush(stdin);
//cin.sync();
/*cin.get(ch);
cin.get(ch1);
cin.get(ch2);
cout<<ch<<" "<<ch1<<ch2;*/
cin>>a>>b;
cout<<a<<b<<endl; 
}



當然也可以用cin.ignore();這裏就不過多敘述,留給讀者進行嘗試!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章