另一种可能性是灌输流与使用特殊ctype
端面的语言环境。流使用ctype构面来确定什么是“空白”,它将它视为分隔符。用ctype方法将分隔符字符分类为空格,读取可能非常简单。下面是实施方面的一种方法:
struct field_reader: std::ctype<char> {
field_reader(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(table_size, std::ctype_base::mask());
// we'll assume dates are either a/b/c or a-b-c:
rc['/'] = std::ctype_base::space;
rc['-'] = std::ctype_base::space;
return &rc[0];
}
};
我们使用,通过使用imbue
告诉流使用的语言环境,包括它,然后从流中读取的数据:
std::istringstream in("07/3/2011");
in.imbue(std::locale(std::locale(), new field_reader);
随着该在地方,分裂变得几乎微不足道 - 只用了几个istream_iterator
s到从字符串读取的块(这是嵌入在istringstream
)初始化向量:
std::vector<std::string>((std::istream_iterator<std::string>(in),
std::istream_iterator<std::string>());
如果你只在一个地方使用它,这显然会导致矫枉过正。但是,如果你使用它的话,它可以很长的一段时间来保持代码的其余部分非常干净。
[Splitting String C++]的可能重复(http://stackoverflow.com/questions/275404/splitting-string-c) – 2012-04-08 06:56:41