假設stringstream包含James is 4
,我可以寫一些類似getline (stream, stringjames, ' ')
的單詞,但是有什麼方法可以知道我已經擊中了該行的末尾?如何讓std :: getline在達到stringstream結尾時通知我?
紅利問題! 案例1:James is 4
案例2:James is four
如果我通過一個字符串流的話迭代,我期望得到的4一個int VAL,而是我收到一個字符串,什麼將是最好的方式檢查這個?
假設stringstream包含James is 4
,我可以寫一些類似getline (stream, stringjames, ' ')
的單詞,但是有什麼方法可以知道我已經擊中了該行的末尾?如何讓std :: getline在達到stringstream結尾時通知我?
紅利問題! 案例1:James is 4
案例2:James is four
如果我通過一個字符串流的話迭代,我期望得到的4一個int VAL,而是我收到一個字符串,什麼將是最好的方式檢查這個?
您檢查返回值,看它是否計算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
假設字符串流包含詹姆斯是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
轉換成一個數字。你可以試試strtoi
strtol
等 - 它們有助於指示整個值是否是合法的數字,以便可以檢測和拒絕像「4q」這樣的值。
另一種方法是首先嚐試將流式傳輸到整型,並且僅當它重置流中的錯誤標誌並獲取字符串時纔會失敗。我不記得是否需要重新定位流,以便可以讀取字符串變量,但是可以編寫幾個測試用例並將其排除。
或者,您可以使用正則表達式和子表達式匹配來解析輸入:隨着表達式變得更加複雜,更有用。
+1,這就是我要做的,儘管要精確地回答這個問題,您不僅應該測試流是否有效,還應該測試失敗是由於達到文件結尾(而不是其他任何其他錯誤) –
@DavidRodríguez-dribeas謝謝,我修改了答案以反映這一點。我不認爲你需要用'getline'來做到這一點,儘管它不會因爲其他原因而失敗(我認爲)。 –