我正在寻找一个很好的例子来说明如何重载流输入运算符(运算符>>)来解析一些具有简单文本格式的数据。我读过this tutorial但我想做一些更高级的事情。在我的例子中,我有固定的字符串,我想检查(并忽略)。假设链接中的 2D 点格式更像是
Point{0.3 =>
0.4 }
预期的效果是解析出数字 0.3 和 0.4。 (是的,这是一个非常愚蠢的语法,但它包含了我需要的几个想法)。大多数情况下,我只想看看如何正确检查固定字符串的存在、忽略空格等。
更新: 糟糕,我在下面发表的评论没有格式(这是我第一次使用这个网站)。 我发现空格可以用类似的东西跳过
std::cin >> std::ws;
为了吃掉我的绳子
static bool match_string(std::istream &is, const char *str){
size_t nstr = strlen(str);
while(nstr){
if(is.peek() == *str){
is.ignore(1);
++str;
--nstr;
}else{
is.setstate(is.rdstate() | std::ios_base::failbit);
return false;
}
}
return true;
}
现在如果能够获取解析错误的位置(行号)就好了。
更新 2: 获得行号和注释解析工作,仅使用 1 个字符前瞻。可以在此处查看最终结果 AArray.cpp , 在函数 parse() 中。该项目是一个可(反)序列化的 C++ 类 PHP 数组类。
最佳答案
您的运算符>>(istream &, object &) 应该使用其格式化和/或未格式化的提取函数从输入流中获取数据,并将其放入您的对象中。
如果你想更安全(在时尚之后),在你开始之前构造和测试一个 istream::sentry 对象。如果遇到语法错误,可以调用setstate( ios_base::failbit )
以防止任何其他处理,直到您调用 my_stream.clear()。
参见 <istream>
(以及 istream.tcc,如果您使用的是 SGI STL)作为示例。
关于c++ - 重载C++提取运算符>>解析数据的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1403046/