Какая польза от stream >> z1, когда stream.peek()==’n’

#c #class #stream #operator-overloading

#c #класс #поток #перегрузка оператора

Вопрос:

 istreamamp; operator>>(istreamamp; stream, list<monom>amp; 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. Если это не ваш код, почему бы не спросить человека, который его написал?

2. Вы читали об std::noskipws ? Я думаю, вы узнаете, почему stream >> z1 это делается там.

3. @NathanOliver Если бы у меня была такая роскошь, я бы

4. Я думаю, это так, что когда данные считываются из потока в объект monom, новые строки не помещаются в объект, поскольку вместо этого они считываются в переменную char z1.

Ответ №1:

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

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

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

Комментарии:

1. Это имеет смысл, но почему это stream >> z1 необходимо в цикле, наверняка было бы достаточно просто иметь break там?

2. @user9078057 как я уже сказал, разрыв строки извлекается из потока до завершения цикла. Если бы final >> z1 был опущен, разрыв строки остался бы в потоке для последующего чтения для извлечения. Разрыв строки используется в качестве маркера конца данных, поэтому его следует извлечь вместе с данными, которыми он заканчивается

3. Хорошо, я понимаю, но почему именно это должно быть stream >> z1 , а не, например, stream >> z2 или stream >> m.a . Другими словами, почему z1 необходим выбор, мне это кажется произвольным

4. @user9078057 потому что это произвольно. z1 доступно в этот момент. Код использует z1 и z2 в качестве временных заполнителей, он мог бы использовать любой из них при окончательном чтении разрыва строки. Автор случайно выбрал z1 вместо z2 или объявил еще одну переменную только для этого чтения. В данном случае это действительно не имеет значения.