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