代碼的一個公共的一塊,我使用簡單的字符串分割看起來是這樣的:方式std :: stringstream可以設置失敗/壞點?
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
有人提到這會悄悄出現在std::getline
「燕子」的錯誤。當然,我同意這種情況。但它發生在我身上,在這裏可能會出錯在實踐中,我將需要擔心。基本上這一切歸結爲:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
一個stringstream
由string
的支持,所以我們不必擔心任何與從文件中讀取相關的問題。這裏沒有類型轉換,因爲getline
只是讀取直到看到行分隔符或EOF
。所以我們不能得到像boost::lexical_cast
這樣的錯誤。
我根本無法想到除了沒有分配足夠的內存以外可能會出錯,但在std::getline
甚至發生之前,這隻會拋出一個std::bad_alloc
。我錯過了什麼?
什麼是錯誤的是返回一個本地引用。 – UncleBens 2010-04-01 19:34:29
好,但我並不是想要返回一個本地引用,這是一個簡化的例子來演示這個問題的基礎 – 2010-04-01 19:37:56
只有當你還沒有調用stringstream時,'stringstream'才支持'rdbuf(otherstreambuf)'。 – 2011-06-26 04:45:23