cin函数的一点理解
問題
最近學習C++碰到這樣一個問題,while(cin>>s){},這樣的一個語句用什么樣的輸入能夠結束運行,到網上一查,大家給出的答案是ctrl+z,可以使該程序結束。但是,對于ctrl+z的作用和ctrl+z的實質是什么卻都沒有深刻的剖析。于是,翻書找到了些內容,認為自己解決了這個問題。現將學習到的內容記錄如下。首先,先了解一下,究竟能是一個輸入流停止工作的有哪些條件。
流的狀態
流有正常的狀態和錯誤的狀態。流只有在正常的狀態下,才能夠正常的工作。輸入流在正常的工作狀態下,才能夠執行讀的操作。ctrl+z,的作用其實就是讓流從正常的工作狀態,轉為不工作的其實也可以說是錯誤的工作狀態,所以才能讓while(cin>>s){}這樣的語句結束。
每個流對象都維護了一組條件標志,通過這些條件標志,可以監視流當前的狀態。可以調用下面四個謂詞成員函數:
1.如果一個流遇到文件結束符,eof返回true。
if(inOut.eof())
//ok,都讀進來了
2.如果試圖做一個無效的操作,比如seeking重定位操作超出了文件尾。則bad()返回true。一般地,這表示該流由于某種未定義的方式而被破壞了。
3.如果操作不成功,如打開了一個文件流對象失敗或者遇到了一種無效的輸入格式,則fail()返回true
ifstream iFile(filename,ios_base::in);
if(iFile.fail())//不能打開
error_message(........);
4.如果其他條件都不為true,則good()返回true。
if(inOut.good())
顯示地修改流對象的條件狀態有兩種方式。第一,使用clear()成員函數,可以把條件狀態復位到一個顯式的值。第二,使用setstate()成員函數。
測試
int main(){
cout<<cin<<endl;
string s;
while(cin>>s)
{
cout<<s;
}
cout<<cin<<endl;
}
輸入 a enter b enter ctrl+z enter ctrl+z enter
運行結果:
00480F20
a b
00000000
ctrl+z究竟是什么
ctrl+z的作用是結束流,相當于eof。
總結
if(!cin)
流不能正常工作
else
流能正常工作
寫程序的時候,可能要注意這點。ctrl+z只是一個小插曲,但是能從中學到些東西,感覺到欣慰。。。。
轉載于:https://www.cnblogs.com/yxnchinahlj/archive/2011/03/21/1990649.html
總結
以上是生活随笔為你收集整理的cin函数的一点理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 针对C64x+的一些优化经验
- 下一篇: [转]SqlServer2005 各版本