Итак, у меня есть некоторый код, который разбивает строку на некоторые другие переменные с помощью sscanf, который выглядит следующим образом.
if(sscanf(input_line.c_str(), "%s %s %lf %lf %lf", &string1, &string2, &point1, &point2, &point3) != 5) {
//does stuff
throw;
}
Я использую возвращаемое значение sscanf для проверки входной строки.
я хотел бы использовать
istringstream ss(input_line);
ss >> string1 >> string2 >> point1 >> point2 >> point3;
if( ??????? ){
//does stuff
throw;
}
Но я не знаю, как проверить, было ли заселено ровно 5 вещей. Я бы хотел избавиться от унаследованного кода C, поскольку мне не нравятся массивы символов, но я не хочу терять проверку ошибок. Я был бы очень признателен за любые советы по адаптации этого кода istringstream или использованию совершенно другого кода в стиле c ++, чтобы избавиться от массивов символов, но сохранить существующую функциональность.
Заранее спасибо,
Максимум
Прежде всего помните, что все функции ввода оператора (>>
) возвращает входной поток и, во-вторых, помните, что поток может использоваться как логический состояние.
Это означает, что вы можете сделать, например,
std::string string1, string2;
double point1, point2, point3;
if (some_input_stream >> string1 >> string2 >> point1 >> point2 >> point3)
{
// All is okay
}
else
{
// One of the input operations failed
}
Чтобы точно знать, какая операция ввода не удалась, вы можете выполнять их по одному.
Других решений пока нет …