我试图从文件,其中每行有由逗号和空格分隔15个字段读取数据。数据不是单一类型的。目前,我在做什么是逐行读取数据线,每条线传递到istringstream每间阅读我做到以下几点:
ins.ignore(25,','); //ins is the istringstream
然而,我不喜欢我的方法,想一个更清洁的一个。什么是更好的方式呢?另外我只想使用stl而不需要外部库。基本上我想要的是使用逗号作为分隔符来标记每行。
我试图从文件,其中每行有由逗号和空格分隔15个字段读取数据。数据不是单一类型的。目前,我在做什么是逐行读取数据线,每条线传递到istringstream每间阅读我做到以下几点:
ins.ignore(25,','); //ins is the istringstream
然而,我不喜欢我的方法,想一个更清洁的一个。什么是更好的方式呢?另外我只想使用stl而不需要外部库。基本上我想要的是使用逗号作为分隔符来标记每行。
清洁方法(如果我理解正确的),只是读入逗号虚拟变量
char comma;
ins >> comma;
这将跳过任何空白,然后读取逗号,然后你就可以忽略不计。
我想过这样做,但事情是,有些领域可能会空年。例如“12,,你好”。我想我可以通过检查读取值是否是逗号来处理这种情况,然后我将它设置为空。 – turingcomplete
但是,如果它不是逗号,那么你就有'未读'字符的问题。听起来你需要忘记流IO,并对你的线做适当的解析。 Zamfir提供了很多链接来回答这个问题,这个问题很多。 – john
他可以在使用'std :: ws'跳过空格后在下一个字符处“偷看()”。像逗号分隔文件这样的微不足道的修补活动可以通过使用流来完成。 –
只需使用一个自定义的机械手:
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 ...
我相信这是一个重复的: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等 –
如果你还行与C,你可以看看'strtok' –
...或sscanf(“%as,%as,%as,%as ...”) – rici