2012-12-16 47 views
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; 
} 

回答

2

您的fseek呼叫是錯誤的。調用fread之後的文件位置將會在後面讀取數據,因此您可以直接閱讀而不需要查找。

之前發生了什麼事是你讀X字節,做了必要,但是無害fseek到文件位置X,然後讀出用Y字節,但確實有害fseek迴文件位置X,讓你不停地再次讀取相同數據。

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"); 
     } 
} 
+0

'還要注意sizeof(unsigned char)將始終爲1' - 如果您可以假設代碼沒有運行,例如,許多16位DSP處理器。一個安全的假設,當然,但不是很安全,不能被提出。 – mah

+1

好的,刪除它。對這些神聖的C戰爭(「sizeof(char)是1」,「不要投出malloc」......)有點厭倦 - 就在昨天我使用了「sizeof(char)」,並得到了一個評論,不要這樣做:http://stackoverflow.com/questions/13895073/store-an-int-in-a-char-c/13895113#13895113 – schnaader

+1

我瞭解「不施放malloc」神聖的戰爭挫折,但底線是一個字符不保證是8位寬。儘管如此,用const代替sizeof對於代碼可維護性來說並不是一個好主意;如果有的話,我會建議在這種情況下使用'sizeof(* data)',這樣如果'將來數據類型發生變化,尺寸意圖仍然得到滿足。無論如何,我爲你的答案+1了。當你的答案出現時,我正準備發佈有關fseek的信息。 – mah