我正在学习C++,并且正在做一个处理代表有理数(例如½)的类的项目。我已经重载了istream >>运算符,以便它可以正确地从流中读取有理数。

我在将整数带入流中以获得有理数时遇到问题。例如,如果有人键入2,我希望从流中将其读取为2/1。有人告诉我使用peek()函数可以工作,但我不知道怎么做。这是代码:

std::istream& operator>>(std::istream& is, Rational& r)
{
  int p, q;
  char c;
  is >> p >> c >> q;

  if (!is)
    return is;

  // Require that the divider to be a '/'.
  if (c != '/') {
    is.setstate(std::ios::failbit);
    return is;
  }

  // Make sure that we didn't read p/0.
  if (q == 0) {
    is.setstate(std::ios::failbit);
    return is;
  }

  r = Rational(p, q);
  return is;
}

除非输入整数,否则它完美地工作。我希望将其读取为(int)/1

有什么建议么?

最佳答案

如果您分解is >> p >> c >> q;可能会有所帮助,因此您可以在每次提取后检查流的状态(并进行peek ing):

int p, q = 1; // default is 1

if(!(is >> p))
    ; // p is not good, handle it

if(is.peek() == '/')
{
    // there's an /
    is.ignore(1); // or is.get() to skip over it

    if(!(is >> q))
        ; // q is not good, handle it
}

// the following shall not be executed if extraction of q or p fails
r = Rational(p, q);

可能不需要c变量。另外,如果有类似1?的内容,它将读取1,将?保留在流中,您会得到1/1。它不是那么贪婪(您可以更改)。

09-08 05:41