2011-05-27 54 views
3

我正在嘗試在C++中創建一個能夠區分兩個.txt文件的程序。Diff算法C++

struct line 
{ 
    string text; 
    size_t num; 
    int status; 
}; 

void compareFiles(vector<line> &buffer_1, vector<line> &buffer_2, size_t index_1, size_t index_2) 
{ 
    while(index_1 < buffer_1.size()) 
    { 
     while(index_2 < buffer_2.size()) 
     { 
      X = buffer_1[index_1].text; 
      Y = buffer_2[index_2].text; 
      if(X == Y) 
      { 
       ++index_1; 
       ++index_2; 
      } 
      else 
      { 
       LCS(); 
       string lcs = printLCS(X.length(), Y.length()); 

       /* 
       * Here's my problem 
       */ 

      } 
     } 
    } 
} 

正如你所看到的,我有兩個緩衝區(行矢量),以前加載了文件內容。我也有LCS算法功能齊全(測試)。 LCS在全局定義的字符串X和Y上工作。

因此,我真正需要做的是逐行比較緩衝區和LCS,但我沒有辦法做到這一點。

你能幫我嗎?

+0

我建議不嵌套你的兩個'while()'循環 - 當你用完'buffer_2'中的行時會發生什麼? 'index_1'永遠不會增加,最外層的'while'循環永遠不會終止。 'while(index_1 sarnold 2011-05-27 23:25:49

回答

0

首先,我會重寫LCS()以兩行爲參數並返回最長的常見序列 - 我想像一個函數簽名,如std::string LCS(const line& lhs, const line& rhs)。然後我會修改你的while循環如下。

for(int i = 0; i < buffer_1.size(); ++i) 
{ 
    for(int j = 0; j < buffer_2.size(); ++j) 
    { 
     std::string lcs = LCS(buffer_1[i].text, buffer_2[j].text); 
     std::cout << "LCS[" << i << "][" << j << "]: " << lcs << std::endl; 
    } 
} 

這將找到並打印最長公共序列中buffer_1buffer_2線的每個組合。這是你想要做的嗎?我正確理解你的問題嗎?

6

如果有疑問,我通常會按照以前做過的人來做。歷史悠久的差異化程序一直存在,並且做你想做的事情。此外,它是開源的,所以轉到ftp://mirrors.kernel.org/gnu/diffutils/diffutils-3.0.tar.gz並檢查出來。

一旦你解壓檔案,打開src/analyze.c。所述diff_2_files功能開始在線路472執行實際比較從512線運行的代碼 - 537.它們轉載如下:

for (;; cmp->file[0].buffered = cmp->file[1].buffered = 0) 
{ 
    /* Read a buffer's worth from both files. */ 
    for (f = 0; f < 2; f++) 
     if (0 <= cmp->file[f].desc) 
      file_block_read (&cmp->file[f], 
       buffer_size - cmp->file[f].buffered); 

    /* If the buffers differ, the files differ. */ 
    if (cmp->file[0].buffered != cmp->file[1].buffered 
      || memcmp (cmp->file[0].buffer, 
        cmp->file[1].buffer, 
        cmp->file[0].buffered)) 
    { 
     changes = 1; 
     break; 
    } 

    /* If we reach end of file, the files are the same. */ 
    if (cmp->file[0].buffered != buffer_size) 
    { 
     changes = 0; 
     break; 
    } 
} 

有加載相同大小的兩個緩衝器,然後加載每個文件的想法進入緩衝區。使用memcmp,一次比較兩個文件一個緩衝區,並查看是否有任何緩衝區與另一個不同。如果任何緩衝區比較不等於,那麼這兩個文件是不同的。同樣重要的是要注意,您不必一次讀取兩個以上的緩衝區數據,因此這種方法也適用於大型文件。

+2

+1從良好的開源代碼庫學習:) – vrince 2011-05-28 00:37:48

+0

源代碼在這裏http://git.savannah.gnu.org /cgit/diffutils.git/tree/src/analyze.c – nodakai 2014-01-30 11:56:43