2012-11-03 311 views
0

我正在使用我從教程中抓取的這段代碼片段。它旨在壓縮來自輸入文件的數據並將其放入輸出文件。然而,它雖然運行時,給出了一個分段錯誤:zlib壓縮錯誤

int map_Compress(char *inmapfile, char *outmapfile) 
{ 
    FILE *infile = fopen(inmapfile, "rb"); 
    gzFile outfile = gzopen(outmapfile, "wb"); 
    if (!infile || !outfile) return -1; 
    char inbuffer[1]; 
    int num_read = 0; 
    unsigned long total_read = 0; 
    while ((num_read = fread(&inbuffer, 1, sizeof(inbuffer), infile)) > 0) 
    { 
     printf("%d\n",total_read); 
     total_read += num_read; 
     gzwrite(outfile, inbuffer, num_read); 
    } 
    fclose(infile); 
    gzclose(outfile); 
    return total_read; 
} 

而且它被稱爲是這樣的:

int main() 
{ 
    if (map_Compress("maps/main.map", "maps/main.mz") < 0) 
    { 
     printf("Compression failed, couldn't open file(s)\n"); 
    } 
    return 0; 
} 

如何處理該段錯誤的?我在屏幕上看到的所有內容是:

0 
1 

然後程序崩潰了......這裏出了什麼問題?我的輸入文件有一些垃圾內容,所以不應該將數據壓縮到輸出文件中?

請幫幫忙,我敢肯定,這是一個簡單的問題,我已經忽略了:)

+0

所以你打算一次讀取文件1字節?你可能想要調整緩衝區的大小(例如,在緩衝區[1024];'中的無符號字符)。 – WhozCraig

+0

'printf()'轉換說明符不匹配,傳入的內容是'num_read'和'total_read'應聲明爲'size_t'。 – alk

+0

這裏的代碼運行良好。由於在調用'map_Compress()'之前發生的不好的事情,最有可能的是你會目睹一個不正常的函數。 – alk

回答

-3

代替

fread(&inbuffer, 1 

嘗試

fread(inbuffer, 1 

這裏:

gzwrite(outfile, inbuffer, num_read); 

我不知道這個函數做什麼,但可能你試圖從只包含一個字節的inbuffer中讀取num_read字節。

+0

'&'不應該也沒有區別。它不關心緩衝區中有多少個字節。 – phillid

+0

'&'也沒有意義 –

2

顯示的代碼沒有任何問題會導致崩潰。它必須在其他地方發生。你沒有調試器來告訴你它墜毀的位置嗎?

有幾件小事情要修復。爲便於攜帶,infile應該與NULL比較,outfile應該與Z_NULL比較,而不是使用!。如果fopen()失敗並且gzopen()成功,則應該在錯誤返回上應該gzclose()以避免巨大的內存泄漏。反之亦然。 printf格式應爲%lu。 (您需要稍微調整一下編譯器的警告級別。)printf應該加在total_read之後,因爲最後打印的號碼不會是實際讀取的數字。 map_compress()應返回unsigned long,而不是int,因爲您要退回total_readfread()中有一個無關的& - 不會傷害,但會造成混淆,如果將inbuffer更改爲分配的緩衝區,將導致失敗。

您的代碼被正確地裝入以支持比一個字節更大的輸入緩衝區。爲了效率,它應該更大。至少4K或8K。

+0

是的,謝謝你。由於128字節無法正常工作,我故意將緩衝區更改爲1個字節作爲測試。我總是會改變它:)謝謝你的提示.... – phillid

+0

map_compress()不應該返回一個無符號的long,因爲我返回-1失敗:P但我明白它真的應該匹配變量I回來了 – phillid