2010-05-03 111 views
2

我正在設計一個圖像解碼器,並作爲第一步,我試圖複製使用c。即打開文件,並將其內容寫入新文件。以下是我使用的代碼。複製二進制文件的內容

while((c=getc(fp))!=EOF) 
    fprintf(fp1,"%c",c); 

其中fp是源文件,fp1是目標文件。 程序執行時沒有任何錯誤,但圖像文件(「.bmp」)未正確複製。我觀察到複製文件的大小較小,只有20%的圖像可見,其他都是黑色的。當我嘗試使用簡單的文本文件時,副本已完成。

你知道問題出在哪裏嗎?

+0

標題應該更好:「複製二進制文件的內容」,這不是特定於圖像。重新標記。 – leonbloy 2010-05-03 13:51:45

回答

9

確保變量c的類型是intchar。換句話說,發佈更多的代碼。

這是因爲EOF常數的值通常爲-1,如果你讀字符char尺度的值,每一個是0xff將如下的EOF常數字節。用int的額外位;有兩個空間可以分開。

+0

是的,這是錯誤,首先我試圖直接使用getc()而不將它存儲在變量中。然後突然我宣佈了一個字符並使用它。謝謝。 – Gan 2010-05-03 12:15:26

+0

真棒抓住,放鬆。 – 2010-05-03 12:23:33

1

您是否以二進制模式打開文件?你傳遞給fopen什麼?

+0

我用r模式,它的工作原理,我也嘗試'rb'。錯誤是我把變量聲明爲char。謝謝。 – Gan 2010-05-03 12:16:38

0

這是最受歡迎的C gotchas之一。

+0

這個解釋很好。謝謝。 – Gan 2010-05-03 16:58:32

0

你應該使用塊一次使用freadfwrite

FILE *fd1 = fopen("source.bmp", "r"); 
FILE *fd2 = fopen("destination.bmp", "w"); 
if(!fd1 || !fd2) 
// handle open error 

size_t l1; 
unsigned char buffer[8192]; 

//Data to be read 
while((l1 = fread(buffer, 1, sizeof buffer, fd1)) > 0) { 
    size_t l2 = fwrite(buffer, 1, l1, fd2); 
    if(l2 < l1) { 
    if(ferror(fd2)) 
     // handle error 
    else 
     // Handle media full 
    } 
} 
fclose(fd1); 
fclose(fd2); 

這大大加快讀取大的塊,和FREAD/FWRITE只能處理二進制數據,所以沒有用\ n問題可能得到(在Windows和DOS上)或\ r(在(舊)MAC上)轉換爲\ r \ n

+0

一個非常好的建議,我也會在我的程序中使用它,看看它是如何工作的。謝謝。 – Gan 2010-05-06 09:45:55