C ++,减去某些字符串?

时间:2010-10-24 09:59:42

标签: c++ string

这是一个家庭作业,因此我希望你们不给我直接的答案/代码,但引导我找到解决方案。

我的问题是,我有这个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;
        }
    }

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

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

3 个答案:

答案 0 :(得分:3)

std::string::find不返回布尔值。如果成功则返回子字符串匹配的字符串中的索引,否则返回std::string::npos

所以你想说:

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

答案 1 :(得分:0)

通常,使用字符串匹配不能从HTML文件中提取值。需要一个合适的HTML解析器 - 它们可以作为标准代码用于C ++。

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

按行读取可能不起作用,因为HTML文件可能是一个大行。然后输出您找到的每一行将只发出整个文件。因此,尝试正则表达式并查找代码的小部分并输出它们。正则表达式库将具有“全部匹配”命令(我忘记了确切的名称)。

答案 2 :(得分: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不依赖于特定的空格。