代码的一个公共的一块,我使用简单的字符串分割看起来是这样的:方式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