Вопрос об ошибке обращения в istream - PullRequest
0 голосов
/ 01 сентября 2018

Этот оператор определен в Программирование: принципы и практика с использованием книги C ++ . У меня два вопроса. Во-первых, почему после обнаружения неверного формата мы устанавливаем битовый бит? Во-вторых, почему после того, как пользователь ввел неверный формат для даты и когда cin находится в состоянии сбоя, дата создается конструктором по умолчанию?

istream& operator>>(istream& is, date& dd)
{
    int y, m, d;
    char ch1, ch2, ch3, ch4;
    is >> ch1 >> d >> ch2 >> m >> ch3 >> y >> ch4;
    if (!is) return is;
    if (ch1 != '(' || ch2 != ',' || ch3 != ',' || ch4 != ')') { // oops: format error
        is.clear(ios_base::failbit);
        return is;
    }
    dd = date{ d,m,y }; // update dd
    return is;
}

1 Ответ

0 голосов
/ 01 сентября 2018

Первый вопрос. Чтобы сообщить следующей функции, использующей текущий поток, о том, что что-то пошло не так, функция устанавливает новое значение для флагов состояния внутренней ошибки потока.

is.clear(ios_base::failbit);

Таким образом, вы можете проверить после использования оператора >>, что все прошло хорошо, используя функцию

.fail()

от istream

для получения дополнительной информации проверьте fail и clear .

Второй вопрос. Ваш код не вызывает конструктор по умолчанию, он просто не изменяет dd, поэтому, если вы закодировали что-то вроде

std::ifstream f('date.in')
date d;
f >> d;
if(!f.fail())
{ std::cout << d << std::endl;}
else
{ std::cout << "parsing failed" << std::endl;}

если f.fail () имеет значение true, то d не изменяется и был создан с использованием конструктора по умолчанию.

...