2009-07-03 54 views
3

我對於發生了什麼感到有點困惑,我正在玩一些來自「Accelerated C++」的程序,並且遇到了其中一個問題早期的節目(第35頁,如果你碰巧附近有副本)。while(cin >> x)and end-of-file issues

它使用這段代碼:

while (cin >> x) { 
    ++count; 
    sum += x; 
} 

(「數」是一個整數,「X」是一個雙)

它按預期工作,讓我輸入多個值,並把它們相加,但我無法弄清楚「文件結束」信號發生了什麼問題。該書說,循環將繼續運行,直到程序遇到文件信號的結尾,這是Windows中的ctrl + z。

這一切都很好,工作,但是然後我的程序不會讓我再次使用cin。我通常只是設置一個程序來等待一些隨機變量,以便在執行後立即停止控制檯關閉(順便說一句,有沒有更好的方法來做到這一點?),這是我如何注意到這一點,我想知道如果有解決方案。我已經做了一堆搜索,但發現很少沒有說出書中已經說過的內容(按Ctrl + Z,或輸入一個不兼容的輸入類型等)

我正在使用Visual工作室2008年快遞編譯。

回答

7

從一個角度來看,一旦你擊中了輸入流的末尾,那麼根據定義,流中沒有剩下任何東西,所以試圖再次讀取它是沒有意義的。

但是,在'流結束'實際上是由於窗口上的特殊字符如Ctrl-Z,我們知道有可能我們可以從cin再次讀取。但是,讀取失敗將導致設置流中的eof標誌。

要清除此標誌(和所有其他故障標誌),可以使用clear方法。

std::cin.clear(); 

調用此函數後,您可以嘗試另一次讀取。

+0

而在後的情況下它實際上是輸入的結束(想象管道輸入) – 2009-07-03 08:32:10

2

EOF表示STDIN(或者稱爲cin)已關閉。關閉意味着它不能再次使用。

也就是說,我認爲可以打開另一個輸入流,但更好,更正常的解決方案是做更好的輸入/輸出處理,並允許用戶輸入一些令牌,說'停止接受輸入」。

1

它看起來像你正在使用的Windows(否則你會在控制檯上,窗口不會關閉)。你有兩個選擇。

  • 運行命令行應用程序:
    • 啓動CMD。 cd到正確的目錄。然後執行該命令。
      輸出對控制檯正確完成,窗口不關閉。
  • 使用另一種方法來阻止窗口關閉
    • 最簡單辦法就是暫停。
      系統(「暫停」)
  • 如果您沒有結束輸入流,您可以重置它。
    • 即,如果輸入一些導致操作員>>失敗的文本,則會設置錯誤位。
      您可以重置與cin.clear錯誤位()
      如果您關閉流這可能不會工作Ctrl-Z
  • 注意,如果你嘗試使用CIN >>暫停; (其中暫停是char或東西)
    確保流是使用cin.ignore()空,否則暫停不會發生
    作爲代碼只會繼續讀取數據