从标准输入中解析参数的最快方法

时间:2013-03-29 22:39:14

标签: c++ cin

假设您从以下列方式格式化的标准输入中接收信息:

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 个答案:

答案 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
}

我的方法是始终将我的提取物置于某种状态。这意味着您可以尽快发现格式问题。