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