Я изучаю C ++ и делаю проект, имеющий дело с классом, который представляет рациональные числа (например, 1/2). Я перегрузил 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
луг):
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
, Это не так жадно (вы можете изменить это).
Других решений пока нет …