2010-10-24 103 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不依賴於特定的空格。