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++ 中做到这一点?

4

1 回答 1

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
}

它确保您在开始解析之前有一整行。这样,如果单行的解析出现问题,它仍然会移到下一行继续。

例如,我会检查以这样开头的字段#

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

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

于 2013-03-29T22:44:46.660 回答