2010-10-24 69 views
4

这是一项家庭作业,因此我希望你们不要给我直接的答案/代码,而是指导我解决问题。C++,减去某些字符串?

我的问题是,我有这个XXX.html文件,里面有成千上万的代码。但我需要的是提取该部分:

<html> 
... 
<table> 
    <thead> 
     <tr> 
      <th class="xxx">xxx</th> 
      <th>xxx</th>      <th>xxx</th>   </tr> 
    </thead> 
    <tbody> 
     <tr class=xxx> 
     <td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td> 
<td>ZZZZ</td>  <td class="xxx">ZZZZ</td> </tr> <tr class=xxx> 
<td class="xxx"><a href="xxx" >ZZZ ZZ ZZZ</a></td> 
<td>ZZZZ</td>  <td class="xxx">ZZZZ</td> </tr> <tr class=xxx> 
<td class="xxxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td> 
<td>ZZZZ</td>  <td class="xxxx">zzzz</td> </tr> <tr class=xxx> 
<td class="xxx"><a href="xxxx" >ZZZ ZZ ZZZ</a></td> 
    ... and so on 

这是我当前的代码至今:

// after open the file 
while(!fileOpened.eof()){ 
     getline(fileOpened, reader); 
     if(reader.find("ZZZ")){ 
      cout << reader << endl; 
     } 
    } 

“读者”是,我想保持的每行一个字符串变量HTML文件。如果ZZZZ的值,因为我需要活着,值会改变,我应该使用什么方法而不是使用“find”方法? (我真的很抱歉,因为没有提到这部分)

但不是显示我想要的值,它显示HTML文件的其他部分。为什么?我的方法错了吗?如果我的方法错误,我该如何提取ZZZZZ值?

+0

什么是'reader'和什么是'readLine'。它不应该是同一个变量吗? – 2010-10-24 10:06:37

+0

嗨Draco,我编辑了我的问题,它应该是一样的。它的变量相同 – 2010-10-24 10:13:25

+0

甚至没有看到这个问题,你会从我那里得到一个“+ 1”,因为“我希望你们不要给我直接的答案/代码”。如果可以的话,我会给你一个'+ 10'。 – sbi 2010-10-24 11:51:18

回答

2

std::string::find不返回布尔值。如果成功则返回一个索引到子串匹配的字符串中,否则返回std::string::npos。使用字符串匹配是行不通的,从一个HTML文件中提取值

if (reader.find("ZZZ") != std::string::npos){ 
     cout << reader << endl; 
    } 
+0

对不起,我搞乱了代码。我将编辑我的问题 – 2010-10-24 10:09:44

0

一般:

所以,你会想说。一个合适的HTML解析器将是必需的 - 它们可用于C++作为标准代码。

否则,我会建议使用正则表达式库(boost :: regex直到C++ 0x出来)。您可以编写更好的表达式来捕获您感兴趣的文件的部分。

由于HTML文件可能是一条大行,因此按行读取可能不起作用。然后输出你发现的每一行都会简单地发出整个文件。因此,尝试正则表达式并查找代码的小部分并输出它们。正则表达式库将有一个“全部匹配”命令(我忘了确切的名字)。

+0

它看起来像很多事情要研究,如果我使用boost :: regex。我刚开始学习C++,可能需要一些时间来实现它。初学者有没有更简单/更简单的方法? – 2010-10-24 10:31:03

+0

正规表达式,花了我几个星期/几个月才能掌握它=( – 2010-10-24 10:36:15

+0

好吧,HTML解析器比正则表达式更难使用,但我可以说,学习正则表达式将非常值得你的时间,他们一次又一次地出现。 – 2010-10-24 20:59:04

0

从文件中读取行应该是这样的框架代码:

if(!file.good()) 
    throw "opening file failed!"; 

for(;;) { 
    std::string line; 
    std::getline(file, line); 
    if(!file.good()) 
    break; 
    // reading succeeded, process line 
} 

if(!file.eof()) 
    // error before reaching EOF 

(这个滑稽循环是一个检查在循环中间的结束条件没有这样的事情。在C++中,所以你必须在中间使用一个无限循环)

但是,正如我在对你的问题的评论中所说的,逐行阅读HTML代码并不一定有用,因为HTML不依赖于特定的空格。