scanf — C ++ Адаптация кода sscanf к istringstream с проверкой ошибок

Итак, у меня есть некоторый код, который разбивает строку на некоторые другие переменные с помощью 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 ++, чтобы избавиться от массивов символов, но сохранить существующую функциональность.

Заранее спасибо,

Максимум

3

Решение

Прежде всего помните, что все функции ввода оператора (>>) возвращает входной поток и, во-вторых, помните, что поток может использоваться как логический состояние.

Это означает, что вы можете сделать, например,

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
}

Чтобы точно знать, какая операция ввода не удалась, вы можете выполнять их по одному.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]