C 中的檔案結束符

2021-07-12 01:03:31 字數 1242 閱讀 8297

int

main

()

控制台輸入多個字串後,輸入檔案結束符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之前不能有任何字元輸入(回車鍵除外),然後再用回車鍵通知系統做流結束符檢測。

C 檔案結束符

問題描述 windows下 int main string str while cin str cout n end 控制台輸入多個字串後,輸入檔案結束符crtl z,並未使while迴圈結束,該如何跳出while迴圈?解決方法 方法1 回車 ctrl z 回車方法2 改 設定自己的檔案結束符 st...

C 檔案結束符

問題描述 windows下 int main 控制台輸入多個字串後,輸入檔案結束符crtl z,並未使while迴圈結束,該如何跳出while迴圈?解決方法 方法1 回車 ctrl z 回車方法2 改 設定自己的檔案結束符 string a while cin a a x x可以為自己設定的檔案結束...

c 檔案結束符

一直奇怪下面一段程式怎樣才結束,按多少次回車也沒用。includeint main 有人說要按兩次ctrl z再按回車,有人說直接輸入eof就ok。試了下,原來是這樣的。ctrl z 回車 回車或者eof 回車或者 0 回車 windows系統中一般採用阻塞式檢查 ctrl z unix linux...