`cin.clear ()` оставляет входной поток в состоянии сбоя - PullRequest
0 голосов
/ 17 апреля 2020

Я читаю книгу «Ускоренный C ++», и я не могу воспроизвести результаты, связанные с проблемой чтения домашнего задания, даже после точного копирования их кода на моей машине. Основная проблема c заключается в использовании cin.clear () для изменения состояния отказа потока ввода после использования EOF, чтобы указать, что все оценки были введены. Авторы предлагают Ctrl + D на linux системах для EOF. Я уже видел это и это , но они не смогли решить мою проблему.

Вот мой минимальный рабочий пример:

#include <iostream>
#include <string>
#include <vector>

using namespace std;
int main()
{
    string name, city;
    vector<double> homework;
    cout << "Enter your name : " ;
    cin >> name;
    cout << "Hello " + name + "!" << endl;
    cout << endl;
    cout << "Enter your grades" << endl;
    if (cin)
    {
        homework.clear();
        double x;
        while (cin >> x)
        {
            homework.push_back(x);
        }
        cin.clear();
    }
    cout << endl;
    cout << "Enter your city : " ;
    cin >> city ; 
    cout << "You live in " + city << endl;; 
    return 0;
}

После ввода всей домашней работы я нажимаю Ctrl + D, и тогда я ожидаю, что мне теперь будет предоставлена ​​возможность ввести название города. Но программа просто заканчивается после печати двух строк в конце моего кода. Что не так с моим пониманием cin.clear()? Я также хотел бы отметить, что использование cin.ignore() после cin.clear() также не помогает.

1 Ответ

0 голосов
/ 17 апреля 2020

При сбое необходимо сбросить флажки и игнорировать все неверный ввод.

Включить #include <limits> для std::numeric_limits.

    if ( std::cin.fail( ) )
    {
        std::cin.clear( );
        std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n');
    }

Если вы хотите выйти из l oop, используйте значение, которое вы можете проверить (например, -1). Когда вы получите это значение, выйдите из l oop.

double value{ 0 };
while( std::cin >> value && value != -1 )
    homework.push_back( value );

if ( std::cin.fail( ) )
{
    std::cin.clear( );
    std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n');
}

Edit:

Я не видел, чтобы вы пытались завершить stream с EOF. Прочтите этот ответ, чтобы понять, как выполнить sh this.

Как возобновить поток ввода после остановки EOF в C ++?

...