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()
?
Для начала я не уверен, что 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()
.
Если cin.good() возвращает true, вы фактически устанавливаете eofbit (в зависимости от реализации), чтобы ваш вызов очищался. В противном случае вы установите его на goodbit.
Если вы не вызываете cin.clear с параметром, тогда он будет использовать значение по умолчанию, которое является goodbit.
std::cin.good()
не может вернуть true
в своем коде, так как std::cin.fail()
уже вернул true
. И если он вернет true
, кто знает, что вы будете устанавливать. Это может быть eofbit
в некоторых реализациях, но это может быть и что-то еще.
std::cin.clear( std::cin.good() )
даже не компилируется с g ++.
clear
иgood
.