Почему cin.failbit всегда установлен, даже если ввод действителен? - PullRequest
0 голосов
/ 03 января 2019

Я пытался написать программу, которая запрашивает ввод массива char, используя cin.getline(), и если заданный ввод больше, чем длина массива, массив расширяется.

Я использовал cin.failbit, чтобы увидеть, был ли ввод пользователя слишком длинным. Но ничего не получилось. Поэтому после отладки я понял, что проблема заключается в failbit.

Итак, я написал простую программу, чтобы увидеть, что с ней не так, и оказалось, что каким-то образом cin.failbit всегда возвращает true, если в операторе if даже когда ввод кажется действительным .

int main () {
    char name[256];

    std::cout << "Enter your name: ";
    std::cin.getline (name,256, '\n');

    std::cout << "characters read: " << std::cin.gcount() << std::endl;
    if (std::cin.failbit){
        std::cin.clear();
        std::cout << "failed\n";
    }
} 

Например, когда input является "qwer", программа выводит, что 5 символов были прочитаны (cin.gcount), поэтому все должно быть в порядке, но также выводит "fail", что означает, что установлен флаг failbit. Но я считаю, что это не должно быть в этом случае.

здесь вывод программы

Так может ли кто-нибудь объяснить, почему failbit кажется установленным постоянно?

Любая помощь будет высоко ценится

1 Ответ

0 голосов
/ 03 января 2019

std::cin.failbit - это константа, которая указывает, какой из битов ошибки представляет сбой потока.Это не указание текущего состояния потока.Чтобы проверить, установлен ли этот бит, используйте функцию-член std::cin.fail().

Однако, если поток не смог прочитать из-за достижения конца потока, fail() вернет false, что заставит вас поверить, что это удалось.Предпочитайте std::cin.good(), чтобы проверить, была ли последняя операция выполнена успешно.

...