Проблемы с std :: cin.fail () - PullRequest
1 голос
/ 11 июля 2020

Я пишу код для чтения с терминала с помощью cpp, но по какой-то причине он разбился после того, как закончились номера. Из того, что я прочитал в Интернете, я смогу проверить, был ли std::cin успешным, используя std::cin.fail(), но он вылетает раньше.

Код, который я запускаю, -

#include <iostream>

int main()
{
    int x{};

    while (true)
    {
        std::cin >> x;
        if (!std::cin)
        {
            std::cout << "breaking" << '\n';
            break;
        }
        std::cout << x << '\n';
    }
    return 0;
}

с ввод:

test@test:~/learn_cpp/ex05$ ./test
1 2
1
2
^C

Мне приходится нажимать ctrl + c вне программы. Информация о версии:

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1 Ответ

3 голосов
/ 11 июля 2020

Ничто в вашем вводе не заставляет cin устанавливать бит ошибки. Следовательно, while (true) просто продолжит работу. Вы можете ввести букву или что-то, что в противном случае не является int, что установит бит ошибки и вызовет разрыв l oop.

Обратите внимание, что новая строка будет проигнорирована для этого цель.

Если вы знаете, что весь ваш ввод будет в одной строке, то вы можете использовать std::getline для чтения всей строки, а затем std::stringstream для чтения целых чисел из этой строки.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    int x{};
    std::string buff;
    std::getline( std::cin, buff );
    std::stringstream ss( buff );
    while ( ss >> x ) {
        std::cout << x << '\n';
    }

    return 0;
}
...