Самый быстрый способ разобрать аргументы из стандартного ввода

Предположим, вы получаете информацию из стандартного ввода, отформатированного следующим образом:

1 2 3 #3 John Tee #2
4 2 1 @1 Tree Bee #9

<int><int><int><char followed by int><string><string><char followed by int>

Какой самый быстрый способ извлечь эту информацию для использования в программе? Кроме того, предположим, что вы хотите проверить, что 4-й и 7-й аргументы содержат только "#", за которым следует число (и выход в противном случае), или вы хотите проверить, что строка не заканчивается рано, как в:

1 4 2 #4 John

Как вы можете сделать это в C++ самым чистым и эффективным способом?

1 ответ

Решение

Мой любимый подход к повторному анализу строк - использовать std::getline как условие while цикл и затем проанализировать строку внутри:

std::string line;
while (std::getline(input_stream, line)) {
  std::istringstream line_stream(line);
  // Parse the line by extracting from line_stream
}

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

Например, я бы выполнил проверку полей, которые начинаются с # вот так:

int value;
if (line_stream.get() == '#' &&
    line_stream >> value &&
    std::isspace(line_stream.peek())) {
  // Success
}

Мой подход состоит в том, чтобы всегда помещать мои извлечения в какое-то состояние Это означает, что вы поймете проблемы с форматом как можно скорее.

Другие вопросы по тегам