gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:51 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com