Перегрузка istream & gt; & gt; оператор для рационального числового класса. Не знаю, как бороться с целыми числами

Я изучаю 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,

Какие-либо предложения?

2

Решение

Это может помочь, если вы сломаете 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, Это не так жадно (вы можете изменить это).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]