【发布时间】:2011-02-03 12:13:48
【问题描述】:
我用于简单字符串拆分的一段常见代码如下所示:
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。我错过了什么?
【问题讨论】:
-
错误是返回对本地的引用。
-
很好,虽然我并不是要返回对本地的引用,但这是一个简化的示例,用于展示问题的基础
-
只有当您没有调用
rdbuf(otherstreambuf)时,stringstream才会由string支持。
标签: c++ stringstream getline