我正在設計一個圖像解碼器,並作爲第一步,我試圖複製使用c。即打開文件,並將其內容寫入新文件。以下是我使用的代碼。複製二進制文件的內容
while((c=getc(fp))!=EOF)
fprintf(fp1,"%c",c);
其中fp是源文件,fp1是目標文件。 程序執行時沒有任何錯誤,但圖像文件(「.bmp」)未正確複製。我觀察到複製文件的大小較小,只有20%的圖像可見,其他都是黑色的。當我嘗試使用簡單的文本文件時,副本已完成。
你知道問題出在哪裏嗎?
我正在設計一個圖像解碼器,並作爲第一步,我試圖複製使用c。即打開文件,並將其內容寫入新文件。以下是我使用的代碼。複製二進制文件的內容
while((c=getc(fp))!=EOF)
fprintf(fp1,"%c",c);
其中fp是源文件,fp1是目標文件。 程序執行時沒有任何錯誤,但圖像文件(「.bmp」)未正確複製。我觀察到複製文件的大小較小,只有20%的圖像可見,其他都是黑色的。當我嘗試使用簡單的文本文件時,副本已完成。
你知道問題出在哪裏嗎?
確保變量c
的類型是int
,不char
。換句話說,發佈更多的代碼。
這是因爲EOF
常數的值通常爲-1,如果你讀字符char
尺度的值,每一個是0xff
將如下的EOF常數字節。用int
的額外位;有兩個空間可以分開。
是的,這是錯誤,首先我試圖直接使用getc()而不將它存儲在變量中。然後突然我宣佈了一個字符並使用它。謝謝。 – Gan 2010-05-03 12:15:26
真棒抓住,放鬆。 – 2010-05-03 12:23:33
你應該使用塊一次使用fread
和fwrite
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
一個非常好的建議,我也會在我的程序中使用它,看看它是如何工作的。謝謝。 – Gan 2010-05-06 09:45:55
標題應該更好:「複製二進制文件的內容」,這不是特定於圖像。重新標記。 – leonbloy 2010-05-03 13:51:45