Istream не работает. Какой безопасный способ его использования! - PullRequest
0 голосов
/ 30 марта 2011

Поэтому мне интересно, что произойдет, если у меня есть следующий код

int i;
cin>> i;

Но я на самом деле ввел "abc" вместо целого числа. Не получается? Как можно убедиться, что чтение из командной строки не завершилось неудачей?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Будет установлен бит сбоя потока, и дальнейшие операции ничего не сделают, пока бит не будет очищен.Вы можете прочитать больше о битовых потоках здесь .

Если вы не хотите, чтобы он вышел из строя, просто проверьте бит:

int i;
std::cin >> i;

if (!std::cin)
{
    // didn't read correctly, handle it
}

Или однимswoop:

int i;

if (!(std::cin >> i))
{
    // didn't read correctly, handle it
}

Могут быть более надежные способы сбора информации, но то, что вы хотите, зависит от вашей ситуации.

1 голос
/ 30 марта 2011

Почти по определению, вы не можете гарантировать, что чтение из команды линия не подводит Чтобы сделать это, вы должны контролировать то, что было набрано на клавиатуре (или было в файле, или что-то было введено перенаправлено с). Вы должны быть готовы к ошибкам в этом входе. Если вам нужен int, а пользователь вводит "abc", вам нужно ввести сбой, так что вы можете обнаружить ошибку и восстановить.

Во входном потоке после обнаружения ошибки необходимо выполнить сброс это (std::cin.clear()), а затем ресинхронизировать каким-либо образом: «abc» все еще в потоке, и будет следующим, что вы прочитаете --- в зависимости от приложение, istream::ignore может быть использовано, но одна частая идиома для обработки ввода с консоли нужно прочитать строку за строкой, а затем проанализировать строку используя комбинацию std :: istringstream, boost :: regex или любого другого инструменты, которые вам пригодятся. Если строка должна содержать один int, это излишне: std::cin.ignore( INT_MAX, '\n' ) должна хорошо справиться с задачей, но для строк с несколькими полями строка линейный подход, вероятно, предпочтительнее; это также имеет преимущество отличить ошибку из-за конца файла от синтаксических ошибок автоматически. (Ошибка getline на std::cin является концом файла; сбой при чтении istringstream обычно является синтаксической ошибкой.)

...