2017-05-18 41 views
0

我的代碼存在一些問題,代碼沒有編譯,但是當我測試代碼時,我發現如果簽名位於文件末尾(或文件中間),該程序不起作用。文件簽名C

int normalScan(char * fileName, char * sign){ 
    int toReturn = 0; 
    FILE * toScan = fopen(fileName,"rb"); 
    FILE * signature = fopen(sign, "rb"); 
    char * buffer = NULL; 
    char * secondBuffer = NULL; 
    int size = 0; 
    int secondSize = 0; 
    int elements = 0; 
    int i = 0; 

    fseek(signature, 0, SEEK_END); 
    size = ftell(signature); 
    rewind(signature); 

    fseek(toScan, 0, SEEK_END); 
    secondSize = ftell(toScan); 
    rewind(toScan); 

    buffer = malloc(sizeof(char)*size); 
    elements = fread(buffer, 1, size, signature); 

    secondBuffer = malloc(sizeof(char)*size); 
    elements = fread(secondBuffer, 1, size, toScan); 

    if (strcmp(secondBuffer, buffer) == 0){ 
     toReturn = 1; 
    } 
    else{ 
     while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
      rewind(signature); 
      fseek(toScan, -1, SEEK_CUR); 
      if (fgetc(toScan) == fgetc(signature)){ 
       rewind(signature); 
       fseek(toScan, -1, SEEK_CUR); 
       elements = fread(secondBuffer, 1, size, toScan); 

       if (strcmp(secondBuffer, buffer) == 0){ 
        toReturn = 1; 
       } 
      } 

      rewind(signature); 
      strncpy(secondBuffer, "", sizeof(secondBuffer)); 
     } 
    } 

    free(secondBuffer); 
    fclose(toScan); 
    fclose(signature); 
    free(buffer); 

    return toReturn; 
} 
+2

請看[爲什麼「while(!feof(file))」總是出錯?](http://stackoverflow.com/q/5431941/2173917) –

+2

[不要將'malloc'的結果強制轉換爲C](http://stackoverflow.com/q/605845/995714) –

+1

你可能想說幾句關於你的代碼打算做什麼的話。代碼本身並不是很清楚。它是否在文件中搜索已知的簽名? –

回答

0

你有4個問題:

1)您沒有在此範圍內檢查EOF簽名:

while (!feof(toScan)){ 
     if (fgetc(toScan) == fgetc(signature)){ 
      fseek(signature, 0, SEEK_SET); 

您可以檢查龜etc(TOSCAN)和龜etc(簽名)EOF或使用!feof(簽名)。如果簽名不存在且文件大小爲0,則表示遇到問題。你不應該依賴的情況下,該文件將始終有一些數據

2)您的代碼可能包含算法錯誤。逐步檢查你的代碼執行與debuger或只是遵循代碼行。

3)檢查fopen是否返回非零值;檢查文件是否已成功打開。

另外fseek(signature,0,SEEK_SET);和倒帶(簽名);可以條紋下來快退(簽名)在本例中:

 while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
     // deleted rewind 
     fseek(toScan, -1, SEEK_CUR); 
     if (fgetc(toScan) == fgetc(signature)){ 
      rewind(signature); 
      fseek(toScan, -1, SEEK_CUR); 
      elements = fread(secondBuffer, 1, size, toScan); 

      if (strcmp(secondBuffer, buffer) == 0){ 
       toReturn = 1; 
      } 
     } 

     rewind(signature); 
     strncpy(secondBuffer, "", sizeof(secondBuffer)); 
    } 

與此:

 while (fgetc(toScan) != EOF && fgetc(signature) != EOF){ 
     rewind(signature); 
     fseek(toScan, -1, SEEK_CUR); 
     if (fgetc(toScan) == fgetc(signature)){ 
      // deleted rewind 
      fseek(toScan, -1, SEEK_CUR); 
      elements = fread(secondBuffer, 1, size, toScan); 

      if (strcmp(secondBuffer, buffer) == 0){ 
       toReturn = 1; 
      } 
     } 

     rewind(signature); 
     strncpy(secondBuffer, "", sizeof(secondBuffer)); 
    } 

,因爲它總是會設置標誌光標爲0

4)你看起來像你不完全瞭解如何在C上編碼。請閱讀C參考資料並閱讀Herbert Schildt關於C的書籍。 您的營養價值爲:


這裏一些提示您:

1)檢查你的算法(它是工作或沒有)

2)重寫代碼(儘量做到用簡單的代碼你的目標,使用非標準STD是* .h函數)

3)用debuger(使用IDE,編譯器標誌等)調試你的程序。

+0

請看編輯。 – Saga

+0

謝謝,我改變了我的算法,它工作。 順便說一句,我想問你,我怎麼能設置while循環停止時,它到達文件的中間,而不是結束? – Saga