我正在学习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
。它不是那么贪婪(您可以更改)。