2012-11-23 36 views
2

可能重复:
Splitting a string in C++标记化字符串中使用STL

我试图从文件,其中每行有由逗号和空格分隔15个字段读取数据。数据不是单一类型的。目前,我在做什么是逐行读取数据线,每条线传递到istringstream每间阅读我做到以下几点:

ins.ignore(25,','); //ins is the istringstream 

然而,我不喜欢我的方法,想一个更清洁的一个。什么是更好的方式呢?另外我只想使用stl而不需要外部库。基本上我想要的是使用逗号作为分隔符来标记每行。

+6

我相信这是一个重复的:http://stackoverflow.com/questions/1894886/parsing-a-comma-delimited-stdstring和http:// stackoverflow.com/questions/2619227/best-way-to-get-ints-from-a-string-with-whitespace和http://stackoverflow.com/questions/536148/c-string-parsing-python-style和http://stackoverflow.com/questions/3162108/a-better-way-to-split-a-string-into-an-array-of-strings-in-cc-using-whitespac等 –

+0

如果你还行与C,你可以看看'strtok' –

+0

...或sscanf(“%as,%as,%as,%as ...”) – rici

回答

0

清洁方法(如果我理解正确的),只是读入逗号虚拟变量

char comma; 
ins >> comma; 

这将跳过任何空白,然后读取逗号,然后你就可以忽略不计。

+0

我想过这样做,但事情是,有些领域可能会空年。例如“12,,你好”。我想我可以通过检查读取值是否是逗号来处理这种情况,然后我将它设置为空。 – turingcomplete

+0

但是,如果它不是逗号,那么你就有'未读'字符的问题。听起来你需要忘记流IO,并对你的线做适当的解析。 Zamfir提供了很多链接来回答这个问题,这个问题很多。 – john

+1

他可以在使用'std :: ws'跳过空格后在下一个字符处“偷看()”。像逗号分隔文件这样的微不足道的修补活动可以通过使用流来完成。 –

3

只需使用一个自定义的机械手:

std::istream& comma(std::istream& in) { 
    if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(',')) { 
     in.setstate(std::ios_base::failbit); 
    } 
    return in; 
} 
... 
in >> v0 >> comma >> v1 >> comma ...