2013-09-22 92 views
0

我想學習基於Java資源的東西,我想適應它到C++。爪哇什麼是C++相當於Java的StdIn.isEmpty()

來源有:

while(!StdIn.isEmpty()) 
{ 
    //Take input from standard input, and process it... 
} 

在C++中我能想出最接近的解決方案是

while(cin >> someString) 
{ 
    //process someString... 
} 

然而,問題是,該對象的CIN回報狀態。我無法將錯誤的輸入放入std :: string。這可能適用於整數,但不適用於字符串。任何等效的功能或解決方法?

在此先感謝。

+0

當然可以。嘗試輸入EOF。 – chris

+0

至少對我而言,目前尚不清楚你想做什麼。 –

+2

標準Java API中沒有'StdIn'類。你想做什麼? – Joni

回答

2

用C++輸入輸出流,並以C的標準輸入輸出,你不能告訴一個文件是否(如std::cin/stdin是空的,如果你要嘗試從中閱讀。唯一的辦法就是找到實際上從文件中讀取,然後然後檢查是否嘗試成功。

(是的,你可以使用某種形式的peek,但遠不及作爲地道的或實際的。)

所以在C++的標準方法可能是這樣的,在同一時間處理輸入的整行:

for (std::string line; std::getline(std::cin, line);) 
{ 
    // process "line" 
} 

如果你在成功提取輸入一個線上的循環體將只執行。一旦輸入用完數據,循環條件就不再滿足(即流不再「好」),並且循環停止。

同樣的概念適用到C的fgets,以及爲未格式化std::istream::read()fread,以及特定於平臺的功能,如Posix的的read(2):你總是嘗試獲得輸入,然後檢查你是否有任何輸入,並且只有當你確實做了纔會繼續消耗輸入。

+0

嘿Kerrek,謝謝你的回覆。你確定你的代碼可以工作嗎?對我來說(GCC 4.8.1)它總是有效的。如果我按回車,它仍然繼續(字符串是空的,看起來像它是有效的)。或者,也許我把所有這些錯誤的概念? – MatthewRock

+0

@MatthewRock:對「標準輸入」的誤解是:輸入只是創建一個新行,它不關閉標準輸入。讀者只是阻止,等待更多。要關閉標準輸入,您必須執行其他操作,例如按Ctrl-D,或者不要從控制檯讀取,而是重定向:'echo「abc」| ./a.out' –

+0

太好了。謝謝你的回答。我擔心這是一個選擇。 – MatthewRock

相關問題