2012-09-25 28 views
4

假設stringstream包含James is 4,我可以寫一些類似getline (stream, stringjames, ' ')的單詞,但是有什麼方法可以知道我已經擊中了該行的末尾?如何讓std :: getline在達到stringstream結尾時通知我?

紅利問題! 案例1:James is 4 案例2:James is four

如果我通過一個字符串流的話迭代,我期望得到的4一個int VAL,而是我收到一個字符串,什麼將是最好的方式檢查這個?

回答

6

您檢查返回值,看它是否計算true或false:

if (getline(stream, stringjames, ' ')) 
    // do stuff 
else 
    // fail 

至於「加分題」,你也可以從數據流中提取int S和東西的時候做同樣的事情。的operator>>返回值將評估爲true如果讀取成功,並false如果有錯誤(比如有是字母而不是數字):

int intval; 

if (stream >> intval) 
    // int read, process 
else if (stream.eof()) 
    // end-of-stream reached 
else 
    // int failed to read but there is still stuff left in the stream 
+0

+1,這就是我要做的,儘管要精確地回答這個問題,您不僅應該測試流是否有效,還應該測試失敗是由於達到文件結尾(而不是其他任何其他錯誤) –

+0

@DavidRodríguez-dribeas謝謝,我修改了答案以反映這一點。我不認爲你需要用'getline'來做到這一點,儘管它不會因爲其他原因而失敗(我認爲)。 –

1

假設字符串流包含詹姆斯是4,我可以寫一些類似getline(stream,stringjames,'')的單詞來獲取單詞,但是有什麼方法可以知道我已經達到了該行的最後?

這是一般最容易讀入std::string變量 - 默認值是考慮它的空間分隔反正:

std::string word; 
while (some_stream >> word) 
{ 
    // first iteration "James", then "is", then "4", then breaks from while... 
} 

獎金問題!情況1:James是4情況2:James是4

如果我正在迭代字符串流中的單詞,並且我希望接收一個int val,但是我收到一個字符串,那麼最好是什麼方法來檢查這個?

你最好將其讀入首先string,然後檢查是否可以認爲string轉換成一個數字。你可以試試strtoistrtol等 - 它們有助於指示整個值是否是合法的數字,以便可以檢測和拒絕像「4q」這樣的值。

另一種方法是首先嚐試將流式傳輸到整型,並且僅當它重置流中的錯誤標誌並獲取字符串時纔會失敗。我不記得是否需要重新定位流,以便可以讀取字符串變量,但是可以編寫幾個測試用例並將其排除。

或者,您可以使用正則表達式和子表達式匹配來解析輸入:隨着表達式變得更加複雜,更有用。

相關問題