Различия между использованием cin.clear ();

0
while(cin.fail()){

    cout<<"Error: Your line is too long.\nPlease enter a shorter line: ";
    cin.clear(cin.good());
    cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    cin.getline(name, maxCh);
}

Я использую cin.clear(cin.good()); очистить флаги ошибок

Но используя cin.clear(); также работает?, если я называю эту функцию, что хорошего делает cin.good()?

  • 0
    Вы можете прочитать, например, эти справочные страницы для clear и good .
Теги:
cin

2 ответа

1
Лучший ответ

Для начала я не уверен, что std::cin.clear( std::cin.good() ) даже гарантированно скомпилируется. std::cin.good() возвращает bool, std::cin.clear() требует std::ios_base::iostate, и я не уверен, что гарантируется преобразование. (std::ios_base::iostate может быть enum, например.) Во-вторых, даже если он компилируется, он делает только то, что вы хотите случайно: потому что вы выполняете этот код только в том случае, если std::cin.fail() true, std::cin.good() вернет false, который преобразуется в 0 для всех интегральных типов, а std::ios_base::goodbit (что, вероятно, вы хотите) определяется как 0. Это также аргумент по умолчанию для функции, поэтому нет смысла указывать его. (clear может использоваться для установки битов, но он очень жестокий в том, как он это делает, обычно, когда вы хотите установить ошибку, вы будете использовать setstate, которое не сбрасывает никаких существующих ошибок.)

Для чего это стоит: я никогда не нашел случая, когда было бы целесообразно называть std::basic_ios<>::good().

1

Если cin.good() возвращает true, вы фактически устанавливаете eofbit (в зависимости от реализации), чтобы ваш вызов очищался. В противном случае вы установите его на goodbit.

Если вы не вызываете cin.clear с параметром, тогда он будет использовать значение по умолчанию, которое является goodbit.

  • 0
    std::cin.good() не может вернуть true в своем коде, так как std::cin.fail() уже вернул true . И если он вернет true , кто знает, что вы будете устанавливать. Это может быть eofbit в некоторых реализациях, но это может быть и что-то еще.
  • 0
    FWIW: std::cin.clear( std::cin.good() ) даже не компилируется с g ++.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню