我正在尝试使用C读取BMP图像(灰度),将值保存到数组中,并将此数组转换为字符串,其值以逗号分隔。
我的程序在Windows 7 64位下运行良好,但由于库兼容性问题,我不得不转向Windows XP 32位。
我有1,750张图片需要阅读,我想将它们全部存储在一个字符串中。
当我启动我的程序时它会一直运行到509:s图像,然后我得到由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);
}
由于
答案 0 :(得分:1)
你从哪里得到101376
?每个字节最多占用5个字符作为带逗号的十进制数字(例如-127,
),5*26368
为131840
。
答案 1 :(得分:1)
将其设为tmp[4];
三位数,终止0。
另外:fclose
在哪里?我怀疑你的文件句柄用完了。
检查是否fp != 0
。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
在调试器中运行程序。
在调用时设置断点 恐惧 - 以条件为条件 k == 507(当你离开时,这将停止它 期待恐惧成功)。
当程序点击时 断点,检查变量 并检查将要通过的内容 恐惧第一次或两次 你达到了断点,价值观 会很好。
然后在第509次,你会 可能会看到传递的伪造价值 恐惧找出那些 假的价值来自 - 可能设置一个条件 正在设置的变量的断点 无论虚假价值如何。