Stringstream 奇怪的行为
Stringstream weird behaviour
我不知道这是否真的很奇怪,或者这就是应该的样子,但这是我目前的挣扎。假设我们有这样的东西:
stringstream sso("12 1442 nana 7676");
double num = 0;
while(sso >> num || !sso.eof()) {
if(sso.fail()) {
sso.clear();
string dummy;
sso >> dummy;
continue;
}
cout << num << endl;
}
这导致:
12
1442
7676
符合预期。但是,例如,如果我将字符串文字更改为 12 + 1442 nana 7676
,那么我会得到:
12
7676
为什么角色 '+'
把事情搞砸了?
我们现在知道,+
是 double
的有效标记,因此您需要一种方法来跳过 到 下一个 [=23] =]-分隔的令牌,而不是仅仅摆脱它。这个功能可以为你做到:
template<class Ct>
std::basic_istream<Ct>& next_token(std::basic_istream<Ct>& is) {
is.clear();
std::ctype<Ct> const& ctype = std::use_facet<std::ctype<Ct>>(is.getloc());
if (ctype.is(ctype.space, is.peek())) {
return is >> std::ws;
}
Ct c;
while (is.get(c) && !ctype.is(ctype.space, c)) {
;
}
return is;
}
然后您可以将代码更改为:
stringstream sso("12 + 1442 nana 7676");
double num = 0;
while (sso) {
if (!(sso >> num)) {
sso >> next_token;
} else {
cout << num << endl;
}
}
输出:
12
1442
7676
我不知道这是否真的很奇怪,或者这就是应该的样子,但这是我目前的挣扎。假设我们有这样的东西:
stringstream sso("12 1442 nana 7676");
double num = 0;
while(sso >> num || !sso.eof()) {
if(sso.fail()) {
sso.clear();
string dummy;
sso >> dummy;
continue;
}
cout << num << endl;
}
这导致:
12
1442
7676
符合预期。但是,例如,如果我将字符串文字更改为 12 + 1442 nana 7676
,那么我会得到:
12
7676
为什么角色 '+'
把事情搞砸了?
我们现在知道,+
是 double
的有效标记,因此您需要一种方法来跳过 到 下一个 [=23] =]-分隔的令牌,而不是仅仅摆脱它。这个功能可以为你做到:
template<class Ct>
std::basic_istream<Ct>& next_token(std::basic_istream<Ct>& is) {
is.clear();
std::ctype<Ct> const& ctype = std::use_facet<std::ctype<Ct>>(is.getloc());
if (ctype.is(ctype.space, is.peek())) {
return is >> std::ws;
}
Ct c;
while (is.get(c) && !ctype.is(ctype.space, c)) {
;
}
return is;
}
然后您可以将代码更改为:
stringstream sso("12 + 1442 nana 7676");
double num = 0;
while (sso) {
if (!(sso >> num)) {
sso >> next_token;
} else {
cout << num << endl;
}
}
输出:
12
1442
7676