2011-03-24 32 views
1

我試圖讀取BMP圖像(灰階)用C,值保存到一個數組,該數組轉換成字符串與用逗號分隔的值。段錯誤中的fread()

我的程序的Windows 7 64位下運行良好,但我不得不遷移到Windows XP 32位,因爲圖書館的兼容性問題。

我有1,750張圖片需要閱讀,我想將它們全部存儲在一個字符串中。

當我啓動我的程序它去罰款,直至509個圖像,然後我得到所致的fread段錯誤()。這裏是我的代碼:

int i=0,j,k,num,len,length,l; 
unsigned char *Buffer; 
FILE *fp; 
char *string,*finalstring; 
char *query; 
char tmp2[5],tmp[3]; 
query = (char *)malloc(sizeof(char)*200000000); 
string = (char *)malloc(sizeof(char)*101376); 
Buffer = (unsigned char *)malloc(sizeof(unsigned char)*26368); 
BITMAPFILEHEADER bMapFileHeader; 
BITMAPINFOHEADER bMapInfoHeader; 
length = 0; 


    for (k =1;k<1751;k++) 
    { 
    strcpy(link,"imagepath"); 
    //here just indexing the images from 0000 to 1750 
    sprintf(tmp2,"%.4d",k); 
    strcat(link,tmp2); 
    strcat(link,".bmp"); 


     fp = fopen(link, "rb"); 
     num = fread(&bMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); 
     num = fread(&bMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp); 
    //seek beginning of data in bitmap 
    fseek(fp,54,SEEK_SET); 
    //read in bitmap file to data 

    fread(Buffer,26368,1,fp); 
    l=0; 

    for(i=1024;i<26368;i++) 
    { 
     itoa(Buffer[i],tmp,10); 
     len = strlen(tmp); 
     memcpy(string+l,tmp,len); 
     memcpy(string+l+len,",",1); 
     l = l+len+1; 

    } 

    memcpy(query,"",1); 
    memcpy(string,"",1); 
    printf("%i\n",k); 

    } 

感謝

回答

1

使它成爲tmp[4];三個數字並終止0. 另外:哪裏是浮子?我懷疑,你的文件句柄已經用完了。 檢查是否fp != 0

+0

非常感謝你,它實際上解決我的問題,我不知道那件事與運行出的文件句柄,我認爲FP會我每次在打開image.adding FCLOSE(FP)時間進行初始化k循環的結尾解決了我的問題:) – Mehdi 2011-03-24 14:00:09

1

你從哪裏得到101376?您的每個字節最多佔用5個字符(十進制數字和逗號)(例如-127,),5*26368131840

0

擺脫malloc電話中的劇組。和#include <stdlib.h>

在您使用的64位和32位系統中,該程序的輸出是什麼?

#include <stdio.h> 
int main(void) { 
    printf("sizeof (int) is %d\n", (int)(sizeof (int))); 
    printf("sizeof (int*) is %d\n", (int)(sizeof (int*))); 
    return 0; 
} 
0
  1. 在調試器中運行程序。

  2. 設置在通話斷點 FREAD - 使其有條件的 滿足K == 507(這將阻止它,當你 預期FREAD是成功的)。

  3. 當程序命中 斷點,檢查變量 和檢查什麼是即將被傳遞到 FREAD。第一次或第二次你打到 斷點時,數值爲 會好。

  4. 然後在第509次,你會 可能會看到僞造值通過 到fread。找出其中那些 假值的來源 - 可能設定於變量被設置 到任何僞造值是一個條件 斷點。