使用fgets在C中找到特定标记后读取文件的各个部分

时间:2013-01-24 10:20:08

标签: c file fgets

我想要一些关于如何以这样的方式读取'XML'文件的建议,即程序只能读取/存储在满足某些要求的节点中观察到的元素。我正在考虑以下列方式使用两个fgets:

while (fgets(file_buffer,line_buffer,fp) != NULL)
 {
   if (p_str = (char*) strstr(file_buffer,"<element of interest opening")) )
    {
      //new fgets that starts at fp and runs only until the end of the node
       {
         //read and process
       }
    }
 }

这是否有意义或是否有更聪明的方法来做到这一点?

其次(在我的想法中),我是否必须定义一个新的FILE *(如fr),在第二个fgets的开头将fr设置为fp,或者我可以以某种方式滥用原始的文件指针?

2 个答案:

答案 0 :(得分:2)

使用Xmllib2 http://xmlsoft.org/xml.html

等XML解析器

答案 1 :(得分:0)

你的方法对于这项工作似乎并不坏。

您可以从文件中读取整行,然后使用sprintf,strstr或您喜欢的任何函数处理它。使用FILE I / O可以节省您的时间和不必要的开销。

根据您的第二个想法,您可以使用fseek()(参考:man fseek)或rewind()(请参阅:man rewind)使用相同的文件指针{{1} }。您不需要额外的文件指针。

编辑:

如果您可以更改标记格式以符合XML结构,则可以正确使用libXML2和此类库。

如果那是不可能的,那么你必须编写自己的解析器。 一些指示:

  1. 首先将文件中的数据提取到缓冲区中。缓冲区的大小以及动态或静态分配的大小取决于您的规范。

  2. 在缓冲区中搜索,如果非空格字符为fp或标记通常以任何字符开头。如果没有,您只能显示错误并退出。

  3. 现在跟随标签名称,直到第一个空格,或/或&gt;字符。存放它们。按照您的意愿处理=,字符串和内容。

  4. 如果下一个非空白字符是/,请检查它后面是&gt;(或者您的规范中的类似模式,以查找标记是否结束)。如果是这样,您已经完成解析并可以返回结果。否则,您的格式错误,应退出并显示错误。

    如果字符是&gt;,那么您已找到begin标记的结尾。现在遵循内容。 否则以下是一个论点。解析,存储结果,继续执行步骤4.

  5. 阅读内容,直至找到&lt;字符。

  6. 如果该字符后跟/,那么它就是结束标记。检查它后面跟着标签名称和&gt;。如果是,则返回结果,否则抛出错误。

  7. 如果你到了这里,你就找到了嵌套XML的开头。使用此算法解析,然后再次继续4。

  8. 虽然,这是一个非常基本的想法,但我希望它能帮助你开始。

    编辑: 如果您仍想将该文件作为指针引用,请考虑使用<

    如果你添加mmap()一些mmap IPC和足够的内存锁定东西,你可以编写一个并行处理程序,它将更快地处理你的大部分文件。