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