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