2017-10-10 37 views
0

我有很多麻煩後終於拿出這個代碼。它計算文本文件的散列,並將散列添加到文件中。顯然,這改變了散列,所以當我再次運行它時,我會得到另一個散列。我該如何修改這個程序,以便在不修改文件的情況下計算散列?

但是,如果我只是想在當前狀態下散而不改變它 - 我應該怎麼可以在我的代碼改變?它是「f = fopen(apszArgV [1],」rb +「);」誰導致哈希改變?

#include <stdio.h> 
#include "md5.h" 

#define BUFFER_SIZE 1024 

void print_hash(char hash[]); 

int main (int iArgC, char *apszArgV[]) 
{ 
    FILE *f; 
    MD5_CTX ctx; 
    BYTE byHash[16]; 
    BYTE byBuffer[BUFFER_SIZE]; 
    int iReadBytes; 

    if (iArgC < 2) { 
     printf ("Usage: md5_add <file name>\n"); 
     return 1; 
    } 
    f = fopen (apszArgV[1], "rb+"); 
    if (f != NULL) { 

     md5_init(&ctx); 

     while (!feof(f)) { 
     iReadBytes = fread(byBuffer, sizeof(BYTE), BUFFER_SIZE, f); 
     md5_update(&ctx, byBuffer, iReadBytes); 
     if (iReadBytes < BUFFER_SIZE) break; 
     } 

     md5_final(&ctx, byHash); 

     f = fopen("fil1.txt", "a"); 

     for (int i = 0; i < 15; i++) { 
      fprintf (f, "%02X", byHash[i]); 
     } 
     fprintf(f, "\n"); 
     fclose (f); 
    } 

    print_hash(byHash); 

} 

void print_hash(char hash[]) 
{ 
    int idx; 
    for (idx=0; idx < 16; idx++) 
     printf("%02x",(int)((unsigned char)hash[idx])); 
    printf("\n"); 
} 

感謝

新的C BTW

+2

你還沒有解決[你以前的問題]中的任何內容(https://stackoverflow.com/questions/46670913/how-do-i-write-this-hash-array-to-a-text-file)。 –

+0

不是代碼,沒有。但我問這個問題的方式。我瞭解到我得到不同哈希的原因是因爲將散列打印到文件的過程本身正在改變散列本身(duh)。但現在我的問題是,我怎麼才能在不修改文件的情況下獲得散列? – Hi7651

+2

那麼,你怎麼樣纔不修改文件? –

回答

0

對不起,不能用現在發表評論。 與之前實際已經打開2個不同文件的問題不同。 說實話我沒有看到你的代碼爲什麼應該還是打印到您先閱讀散列相同的文件,但我看你需要清理。

的方式

1)名稱的指針,你可以看到他們實際上做:

而不是

FILE *f; 

命名

File * file_to_be_hashed; 

然後更好的爲你的輸出聲明一個新名稱文件。

FILE * listOfHashes = fopen("fil1.txt", "a"); 

另外不要忘記關閉文件,當你與他們所做的:

md5_final(&ctx, byHash) 
fclose(f); 

但正如所說,我真的不明白爲什麼你的代碼仍然會打印到您輸入的文件,除了可能打開到「fil2.txt」不工作。我的猜測是文件fil2.txt尚不存在,所以它不能被打開,作爲你在fopen(「fil1.txt」,「a」)中指定的追加內容。

也沒有理由爲先的fopen是RB +爲r閱讀;-)

也許你瞭解到的FOPEN打開的標誌實際上意味着提供了足夠的權利...... http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html

相關問題