重载C++提取运算符>>解析数据的示例

Vic*_*Liu 5 c++ parsing operator-overloading

我正在寻找一个很好的例子,说明如何重载流输入操作符(operator >>)以使用简单的文本格式解析一些数据.我已阅读本教程,但我想做一些更先进的事情.在我的情况下,我有固定的字符串,我想检查(和忽略).假设链接中的2D点格式更像

Point{0.3 =>
      0.4 }
Run Code Online (Sandbox Code Playgroud)

其中预期的效果是解析数字0.3和0.4.(是的,这是一个非常愚蠢的语法,但它包含了我需要的几个想法).大多数情况下,我只是想看看如何正确检查是否存在固定字符串,忽略空格等.

更新: 哎呀,我在下面做的评论没有格式化(这是我第一次使用这个网站).我发现可以用类似的东西跳过空格

std::cin >> std::ws;
Run Code Online (Sandbox Code Playgroud)

为了吃掉我的食物

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;
}
Run Code Online (Sandbox Code Playgroud)

现在能够获得解析错误的位置(行号)会很好.

更新2: 获得行号和注释解析工作,只使用1个字符前瞻.最终结果可以在AArray.cpp中的函数parse()中看到.该项目是一个(de)可序列化的C++ PHP类数组类.

Pot*_*ter 1

您的运算符>>(istream &, object &) 应该使用其格式化和/或未格式化的提取函数从输入流获取数据,并将其放入您的对象中。

如果您想更安全(以某种方式),请在开始之前构建并测试 istream::sentry 对象。如果遇到语法错误,您可以调用setstate( ios_base::failbit )以阻止任何其他处理,直到调用 my_stream.clear()。

请参阅<istream>(如果您使用 SGI STL,请参阅 istream.tcc)示例。