假设您从以下列方式格式化的标准输入中接收信息:
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
}
我的方法是始终将我的提取物置于某种状态。这意味着您可以尽快发现格式问题。