1. 程式人生 > >Window對於cin輸入流結束的判斷

Window對於cin輸入流結束的判斷

當使用while(cin >> temp) 做迴圈輸入的時候,遇到了無法結束的問題,後來想到window使用 ctrl+z 這個按鍵組合來結束輸入.
使用了這個方式進行結束輸入的時候,發現還可以繼續輸入,並且,最後還會顯示出一個奇怪的字元.如下圖
^z字元
後來在百度尋找了一段時間的資料後,大概的原理如下.

  1. window使用阻塞式檢查,所以只有在使用者按下enter之後,才會把資料放入緩衝區,並檢測是否到達檔案結尾.
  2. 對於ctrl+z這個按鍵組合,當位於一行之中時,window會它當成一個字元看待,但是當他位於一行的開頭時,即ctrl+z的前面沒有任何字元,包括空格,系統會把他當終止來看待.
  3. 如果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.則會輸出一個空字元.