Window對於cin輸入流結束的判斷
阿新 • • 發佈:2019-01-02
當使用while(cin >> temp)
做迴圈輸入的時候,遇到了無法結束的問題,後來想到window使用 ctrl+z
這個按鍵組合來結束輸入.
使用了這個方式進行結束輸入的時候,發現還可以繼續輸入,並且,最後還會顯示出一個奇怪的字元.如下圖
後來在百度尋找了一段時間的資料後,大概的原理如下.
- window使用阻塞式檢查,所以只有在使用者按下
enter
之後,才會把資料放入緩衝區,並檢測是否到達檔案結尾. - 對於
ctrl+z
這個按鍵組合,當位於一行之中時,window會它當成一個字元看待,但是當他位於一行的開頭時,即ctrl+z
的前面沒有任何字元,包括空格,系統會把他當終止來看待. - 如果
ctrl+z
位於一行的中間,則系統會讀取這個無意義的字元,但是後續的字元並不是讀取,直接丟棄,在我的電腦上(window10系統),遇到ctrl+z
之後的所有字元都不再讀取,直到遇到下一個ctrl+z
這個與系統的對結束字元的處理方式有關.
對於while(cin >> temp)
如果輸入一個ctrl+z
之後,cin的狀態識別符號會被更改,所以會遇到下面這個問題.
第二個輸入被直接跳過了!!!這裡要額外的注意,endl
確實是重新整理流,但是,它並不改變cin的狀態識別符號.第一個while迴圈時,輸入了ctrl+z
改變了cin狀態識別符號,使其值為0.所以可以跳出第一個while迴圈,但同理,第二個迴圈他也進不去.必須用cin.clear()
第二個while之所以還輸出原來輸入的字元,並不是因為資料還在流裡,而是第二個迴圈根本沒進去,p2仍舊是原先的那些資料.如果將p2換成一個新的string物件p3.則會輸出一個空字元.