2010-09-28 57 views
2

嘿傢伙,我目前正在試圖實現一個函數使用C,將兩個文件名作爲命令行參數並按字典順序進行比較。如何比較2個文件按字母順序使用C

如果第一個文件的內容小於第二個文件的內容,那麼函數將返回-1,如果第二個文件的內容小於第一個文件的內容,則返回1,如果文件爲0是相同的。

請給我一些建議,我應該如何開始這個。

[編輯]

嘿,夥計們,如果有在問題有任何不清楚的一部分,所以我就張貼鏈接到的問題在這裏遺憾:Original question。這是一個uni任務,所以我們希望只使用基本的C屬性,可能只包括stdio.h,stdlib.h和string.h。對不起,造成的麻煩。另外這裏是我已經有的代碼,現在我的主要問題是該函數不知道file1.txt(參見該鏈接)是否具有比file2.txt長的第一行,但實際上按字典順序較少:

int filecmp(char firstFile[], char secondFile[]) 
{ 
    int similarity = 0; 
    FILE *file1 = fopen(firstFile, "r"); 
    FILE *file2 = fopen(secondFile, "r"); 
    char line1[BUFSIZ]; 
    char line2[BUFSIZ]; 

    while (similarity == 0) 
    { 
     if (fgets(line1, sizeof line1, file1) != NULL) 
     { 
      if (fgets(line2, sizeof line2, file2) != NULL) 
      { 
       int length; 

       if (strlen(line1) > strlen(line2)) 
       { 
        length = strlen(line1); 
       } 
       else 
       { 
        length = strlen(line2); 
       } 

       for (int i = 0; i < length; i++) 
       { 
        if (line1[i] < line2[i]) similarity = -1; 
        if (line1[i] > line2[i]) similarity = 1; 
       } 
      } 
      else 
      { 
       similarity = 1; //As file2 is empty 
      } 
     } 
     else 
     { 
      if (fgets(line2, sizeof line2, file2) != NULL) 
      { 
       similarity = -1; // As file1 is empty 
      } 
      else break; 
     } 
    } 

    fclose(file1); 
    fclose(file2); 

    return similarity; 
} 

[編輯完]

非常感謝,
喬納森·蔡

+1

對不起,很無知,你是什麼意思按字典? (在你的上下文中「less」或「more」意味着什麼) – Matthieu 2010-09-28 10:13:35

回答

1

你允許使用的strcmp?

如果是(未測試):

int ret = 0; 
while (ret == 0) 
{ 
    char line1 [ MAX_LINE_LEN ]; 
    char line2 [ MAX_LINE_LEN ]; 
    if (fgets(line1, MAX_LINE_LEN, file1) != NULL) 
    { 
     if (fgets(line2, MAX_LINE_LEN, file2) != NULL) 
     { 
      ret = strcmp(line1, line2); 
     } 
     else 
     { 
      ret = 1; 
     } 
    } 
    else 
    { 
     if (fgets(line2, MAX_LINE_LEN, file2) != NULL) 
     { 
      ret = -1; 
     } 
     else 
     { 
      break; 
     } 
    } 
} 
return ret; 
+0

我認爲他意思是字節比較字節。 – zvrba 2010-09-28 10:24:06

+0

我現在已經測試過了,它對我嘗試過的測試用例有效。 – Vicky 2010-09-28 10:26:19

+0

@zvrba:如果一個文件沒有在另一個文件之前終止,那麼這就是strcmp所做的。 – Vicky 2010-09-28 10:30:16

2

看一看在UNIX cmp效用,例如源代碼here。相關文件是regular.c。如果您不能使用mmap,則通過fgetc()執行的原則是相同的:只要比較相同的兩個文件中的每一個文件,都要繼續讀取單個字符。如果(如果!)找到差異,則返回比較結果。一個文件的邊界情況是另一個文件的正確前綴(例如「ABC」「ABCCC」)可以通過將EOF視爲一個無限小的值來解決。這已經在C中得到了整齊的解決,因爲fgetc()保證只在EOF上返回一個負值;正確的字符是>= 0

+0

嘿,對不起,但我不認爲我完全理解你的解釋。但是從我可以收集的內容來看,你所說的是逐個檢查每個文件的一個字符並對它們進行比較,並且不要擔心EOF,因爲它已經由fgetc處理,當它發生時它會返回一個負值。如果是這種情況,它與我所做的非常相似,即當文件按字典順序排列較小但第一行較長時它不能解決問題。對不起,如果我在任何部分解釋你的解釋有誤。 – jon2512chua 2010-09-28 18:14:15

相關問題