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

标签 c++ parsing operator-overloading

我正在寻找一个很好的例子来说明如何重载流输入运算符(运算符>>)来解析一些具有简单文本格式的数据。我读过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/

相关文章:

c++ - DrawInstanced 与 DrawIndexed 并将它们混合在一起

ios - 解析XML问题

c++ - 将 ostream 重定向到文件不起作用

python 运算符重载 __radd__ 和 __add__

c++ - 重载运算符有什么问题?

c++ - 无法将法线添加到 .obj 网格

c++ - 导致编译错误的意外模板实例化

来自核心文件的 C++ 异常信息

php - PHP解析/语法错误;以及如何解决它们

parsing - 在 Clojure 中缓存解析的数据