Какая польза от потока >> z1, когда stream.peek () == '\ n' - PullRequest
0 голосов
/ 21 марта 2019
istream& operator>>(istream& stream, list<monom>& pol)
{
    char z1,z2;
    monom m;
    stream >> noskipws;
    while(stream >> m.a >> z1 >> z2 >> m.i) {
        if (z1!=’x’ || z2!=’^’) {
            stream.setstate(ios::failbit);
            break;
        }
        pol.push_back(m);
        // This is where I do not understand why stream >> z1
        if (stream.peek()==’\n’) {
            stream >> z1;
            break;
        }
    }
    pol.sort();
    pol.remove(null);
    return stream;
}

У меня есть класс monom и я хочу перегрузить оператор >> для списка, состоящего из monom. Глядя на код, я все понимаю до момента

if (stream.peek()==’\n’) {
    stream >> z1;
    break;
}

Я понимаю, что stream.peek() смотрит на следующий пробел, и если он пуст (== \n), то почему он должен stream >> z1, это меня смущает.

1 Ответ

1 голос
/ 21 марта 2019

Код запускает цикл чтения monom элементов, отформатированных как <m.a value>x^<m.i value>, до тех пор, пока он не достигнет перевода строки.Предполагается, что между значениями или элементами нет пробелов, включая разрывы строк.

Цикл использует peek(), чтобы проверить, заканчивается ли каждый успешно прочитанный элемент monom разрывом строки или нет.Если имеется разрыв строки, разрыв строки извлекается из потока (поэтому он не остается в потоке для последующего чтения, чтобы увидеть), и цикл заканчивается.В противном случае цикл продолжает читать следующий элемент monom.

Использование noskipws означает, что operator>> не будет рассматривать разрыв строки как пробел, который он может пропустить.

...