2013-03-29 6 views
0

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

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++ самым чистым и эффективным способом?

+0

Не могли бы вы дать более подробную информацию о * формате * ввода, а не только пример? Что означают поля и как они должны быть представлены? –

ответ

2

Мой любимый подход к многократному линии на основе синтаксического анализа является использование 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 
} 

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

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

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

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

+0

Как вы можете проверить, что линия не заканчивается преждевременно? –

+0

@BobJohn Хорошо, тогда одно из ваших изъятий потерпит неудачу, и поэтому условие будет оцениваться как «false». Вам даже не нужна специальная проверка на досрочное завершение. –

+0

Разве это не означает, что я должен проверить, не завершилось ли мое извлечение после каждого извлечения? Например: line_stream >> value; if (value.fail()) –

Смежные вопросы