1
我正在嘗試讀取.bmp圖像並將數據寫入文本文件。代碼運行良好,但問題是,它無法讀取整個圖像一次,所以我不得不多次調用fread()
函數。在執行此操作時,我的代碼將第一次讀取的數據重複存儲到文本文件中。爲了正確讀取整個圖像,我必須做些什麼改變?以下是我的代碼片段。用fread()讀取一個.bmp圖像
int size = width * height;
unsigned char* data = new unsigned char[size];
filename = "image.bmp";
fname = "image_data.txt";
FILE* f = fopen(filename, "rb");
FILE *fp = fopen(fname, "w");
while(totalBytes < size)
{
readsize = fread(data, sizeof(unsigned char), size, f);
totalBytes += readsize;
for(i = 0; i < readsize; i++)
{
fprintf(fp, "%d", data[i]);
if((i % width) == 0 && i != 0)
fprintf(fp, "\n");
}
fseek(f, readsize, SEEK_SET);
readsize = 0;
}
'還要注意sizeof(unsigned char)將始終爲1' - 如果您可以假設代碼沒有運行,例如,許多16位DSP處理器。一個安全的假設,當然,但不是很安全,不能被提出。 – mah
好的,刪除它。對這些神聖的C戰爭(「sizeof(char)是1」,「不要投出malloc」......)有點厭倦 - 就在昨天我使用了「sizeof(char)」,並得到了一個評論,不要這樣做:http://stackoverflow.com/questions/13895073/store-an-int-in-a-char-c/13895113#13895113 – schnaader
我瞭解「不施放malloc」神聖的戰爭挫折,但底線是一個字符不保證是8位寬。儘管如此,用const代替sizeof對於代碼可維護性來說並不是一個好主意;如果有的話,我會建議在這種情況下使用'sizeof(* data)',這樣如果'將來數據類型發生變化,尺寸意圖仍然得到滿足。無論如何,我爲你的答案+1了。當你的答案出現時,我正準備發佈有關fseek的信息。 – mah