我经常使用的一个简单字符串分割代码如下:
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
。我错过了什么吗?