gpt4 book ai didi

c++ - 在文件中搜索标记并将其后的每个字符复制到字符串中,直到找到另一个标记

转载 作者:行者123 更新时间:2023-11-30 05:36:29 26 4
gpt4 key购买 nike

我正在编写一个搜索文件的程序,每次遇到“<”字符时,它都会将它和每个后续字符复制到一个字符串中,直到到达“>”为止。到目前为止,这是我所做的:

while(!file.eof()){
char c;
string tag;

file.get(c);

if(c == '<'){

tag_num++;
tag += c;
}
}

我现在如何继续 file.get(c),将每个字符添加到 tag 直到到达“>”?

我的想法是在 if 循环中添加一个 while(file.get(c) != '>') 循环,但我似乎无法开始工作另一个 file.get(c) 并且这些字符中的每一个都将被复制到 tag 中。

最佳答案

手动快速解析文件变得棘手。您可能想看看 recursive descent parser .

这是一种模式,通过以递归方式解码每个元素的函数来实现文件的语法。

让我们举一个使用简化的 XML 语法的简单示例(在 BNF form 中):

element ::= '<'<tag>'/>'|'<'<tag>'>'<content>'<'<tag>'/>'
content ::= <element>|<freetext>|<freetext><element>
freetext ::= [^<>]<freetext>
tag ::= <alpha>|<alpha><alphanum>
alpha ::= [a-zA-Z]
alphanum ::= [a-zA-Z0-9]

(我认为正则表达式的 [...] 语法不是 BNF 的一部分,但对我来说它比写下所有字母更简单:-) [^<]表示不是 < 的任何字符,它会与 XML 中标记的开头冲突)

这个语法描述了一个元素。一个元素由一个自闭合标签(例如:<br/>)或一个开始标签、内容和结束标签组成。内容可以是一个元素(因此使用前一个元素进行递归定义)、一些自由文本或一些自由文本后跟一个元素。等等……

然后可以机械地执行解析:

Element parse_element(char *c)
{
Element myElement; // Element contains the result of the parsing
// It's a type you have to define !
assert( *c == '<' ); // Handle the error in a more clever way :-)
c++;
Tag myTag = parse_tag(c);
if( *c == '/')
{
// Self-closing tag - add myTag to myElement
c++;
assert( *c == '>'); // Here again, better error handling
c++;
}
else
{
// Or a start tag
assert( *c == '>'); // Here again, better error handling
c++;
Content myContent = parse_content(c);
// Add myTag with myContent to myElement
assert( *c == '/'); // Here again, better error handling
c++;
assert( *c == '>'); // Here again, better error handling
c++;
}
return myElement;
}

我希望这个功能足以让您了解这个概念。要理解的要点是,您首先需要对要读取的格式有清晰的语法定义。然后,您可以机械地实现解析器。

请注意,这个示例太简单了:您至少需要处理实体、属性等……才能解析真正的 XML。

一些工具,例如 GNU Bison一旦掌握了语法,就可以简化代码的编写。

最后,如评论中所述,一些 XML 解析器,如 libxml如果要解析 XML 文件,则存在。它将比实现您自己的解析器更容易和更完整。 XML is a very complex format .

关于c++ - 在文件中搜索标记并将其后的每个字符复制到字符串中,直到找到另一个标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553792/

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