我正在尝试从字符串流中获取特定数据。 我正在从文件中将这些数据读入stringstream。
f 2/5/6 1/11/6 5/12/6 8/10/6
现在,当我想将数据读入变量时,我该怎么做? 这是我想要的格式。
stringstream s(line);
string tmpn;
int t[4];
int a, b, c, d, e;
s >>tmpn >>a >>t[0] >>b >>c >>t[1] >>b >>d >>t[2] >>b >>e >>t[3] >>b;
所以基本上我想要第一个字符,然后每个数字都在不带斜线的单独值中。
我该怎么做? 我尝试使用sscanf,但这太可怕了! 我正在使用C ++ / CLI。
答案 0 :(得分:1)
如果您可以保证输入始终采用该格式,只需用空格替换斜杠。
replace(line.begin(), line.end(), '/', ' ');
stringstream s(line);
string tmpn;
int t[4];
int a, b, c, d, e;
s >>tmpn >>a >>t[0] >>b >>c >>t[1] >>b >>d >>t[2] >>b >>e >>t[3] >>b;
(replace()
标题中找到了<algorithm>
否则,您必须手动拆分它。
答案 1 :(得分:1)
我建议创建一个阅读小组的功能:
void read_group(std::stringstream& s, int& a, int& b, int &c)
{
char temp;
s >> a;
s >> temp; // First '/'
s >> b;
s >> temp; // second '/'
s >> c;
}
如果组和组中的数字相关,您可能希望使用从stringstream
中提取的方法为它们创建一个类。
答案 2 :(得分:0)
使用此类将斜杠/
分类为空格:
struct csv_whitespace
: std::ctype<char>
{
static const mask* make_table()
{
static std::vector<mask> v(classic_table(), classic_table() + table_size);
v['/'] |= space;
return &v[0];
}
csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) {}
};
您可以使用此方面填充输入流:
iss.imbue(std::locale(iss.getloc(), new csv_whitespace));
现在斜线字符将被视为分隔符。例如:
std::istringstream iss("2/5/6 1/11/6 5/12/6 8/10/6");
iss.imbue(std::locale(iss.getloc(), new csv_whitespace));
int i;
while (iss >> i)
{
std::cout << i;
}
输出:
2
5
6
1
11个
...