Почему std :: cin.clear () не работает в этой простой программе? - PullRequest
0 голосов
/ 12 февраля 2019

Я решал некоторые упражнения, чтобы скоротать время, и я столкнулся с поведением, которое я не понимал, я собираюсь объяснить:

Упражнение:

НаписатьПрограмма, которая читает и сохраняет серию целых чисел, а затем вычисляет сумму первых N целых чисел.Сначала попросите N, затем прочитайте значения в вектор, затем вычислите сумму первых N значений.

Поскольку я запросил N в качестве второго шага:

Во втором std::cin (std::cin >> values_to_compute) он должен выйти из оператора while, чтобы продолжить программу, «возможно, только если» прочитанное не является двойным.Так что я могу напечатать, например;'k' или "как дела?"или Ctrl + Z (у меня Windows 10).

int main() {
    try {
        double holder {0};
        std::vector<double> values;
        while (std::cin >> holder) {
            values.push_back(holder);
        }
        std::cin.clear();
        std::cout << "Out of the loop, now entering to the other std::cin\n";
        int values_to_compute {0};
        std::cin >> values_to_compute;
        std::cout << "Computing...\n";
        double result_computed {0};
        for (int i {0}; i < values_to_compute; ++i) {
            result_computed += values[i];
        }
        std::cout << "Result computed " << result_computed << '\n';

        system("pause");
        return 0;
    }
    catch (std::runtime_error& e) {
        std::cerr << e.what() << '\n';

        system("pause");
        return 1;
    }
}

Хорошо, так?Итак ... std::cin оставляет время в плохом () состоянии.Мне нужно позвонить std::cin.clear(), чтобы снова использовать std::cin.

Хорошо, а?Хорошо, если я наберу Ctrl + Z , чтобы выйти из цикла while, std::cin.clear() сработает;если я наберу что-то, что не Ctrl + Z , std::cin.clear() не работает.

Я хочу знать причину такого поведения.

1 Ответ

0 голосов
/ 12 февраля 2019

Это потому, что std::cin::clear очищает состояние ошибки cin, но не не удаляет данные из потока.Вы можете использовать std::cin::ignore(), чтобы прочитать и отбросить строку текста перед чтением values_to_compute.

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

Убедитесь, что #include <limits>, чтобы получить std::numeric_limits.

...