【轉】C++ 文件結束符

轉載自:
http://blog.163.com/zhuandi_h/blog/static/1802702882012210114352789/“>c++文件結束符

問題描述:windows下

int main()

{

string str;

while(cin>>str);

cout<<"\n"<<"end"<<endl;

}

控制檯輸入多個字符串後,輸入文件結束符crtl-Z,並未使while循環結束,該如何跳出while循環?

解決方法:

方法1:回車 - ctrl-z - 回車

方法2:改代碼,設置自己的文件結束符
String a;
while((cin>> a)&&a!=’X’)
X可以爲自己設置的文件結束符。

原因解析:

當從鍵盤輸入一串字符並按回車後,這些字符會首先被送到輸入緩衝區中存儲。每當按下回車鍵後,cin.get()就會 檢測輸入緩衝區中是否有了可讀的數據。cin.get()還會對鍵盤上是否有流結束標識的Ctrl-z或者ctrl-d鍵按下做出檢查,其檢查的方式有兩種,阻塞式以及非阻塞式。

windows系統一般採用阻塞式檢查ctrl-z,Unix/Linux系統下一般採用非阻塞式的檢查ctrl-d.

阻塞式檢查方式是指只有在回車鍵按下之後纔對此前是否有ctrl-z組合鍵按下進行檢查。另外,如果輸入緩衝區中有可讀的數據則不會檢測ctrl-z,因爲有可讀數據,說明還未到流的末尾。需要注意的時,ctrl-z產生的不是一個普通的ascii字符,因此ctrl-z不會跟其他從鍵盤輸入的字符一樣能夠存放在輸入緩衝區中。因此,若使ctrl-z產生作用,輸入ctrl-z之前不應輸入任何字符,即輸入回車鍵把之前輸入的字符全部送入緩衝區中後,緊接着應輸入ctrl-z,然後輸入回車鍵,告知系統檢測流結束符ctrl-z.

非阻塞式是指按下ctrl-d之後立即響應的方式。如果在ctrl-d輸入之前已經從鍵盤輸入了字符,則ctrl-d相當於回車,即把這些字符送到了輸入緩衝區供讀取使用,此時ctrl+d不在起流結束符的作用。若ctrl-d輸入值錢沒有任何鍵盤輸入,則ctrl-d就是流結束的信號。

windows 下ctrl-z使用舉例說明如下:

從鍵盤上輸入abcd^z 再輸入回車鍵後,系統處理如下:因爲回車的作用,前面的abcd等字符被送到輸入緩衝區中,而^z不會產生自負,因此不會存儲到緩衝區中。這是,cin.get()檢測到輸入緩衝區中已經有數據存在,就不會檢測有無^z存在,cin.get()從緩衝中讀取相應的數據,如果讀取完了,則輸入緩衝區重新邊爲空,cin.get()等待新的輸入,可見儘管有ctrl-z輸入,但是之前有其他字符,系統並未監測到流結束符。

因此輸入流結束符的條件就是:^z之前不能有任何字符輸入(回車鍵除外),然後再用回車鍵通知系統做流結束符檢測。

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