1

我正在尝试使用 C 读取 BMP 图像(灰度),将值保存到数组中,然后将此数组转换为值用逗号分隔的字符串。

我的程序在 Windows 7 64 位下运行良好,但由于库兼容性问题,我不得不迁移到 Windows XP 32 位。

我有 1,750 张图片要阅读,我想将它们全部存储在一个字符串中。

当我启动我的程序时,它一直运行良好,直到第 509:th 图像,然后我得到一个由 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);

    }

谢谢

4

4 回答 4

1

你从哪里来101376的?每个字节最多占用 5 个字符作为带逗号的十进制数(例如-127,),5*26368is 131840

于 2011-03-24T10:44:36.683 回答
1

将其设为tmp[4];三位数字并以 0 结尾。另外:在哪里fclose?我怀疑您的文件句柄用完了。检查,是否fp != 0

于 2011-03-24T10:49:31.197 回答
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;
}
于 2011-03-24T11:11:57.083 回答
0
  1. 在调试器中运行您的程序。

  2. 在调用 fread 时设置断点——使其以 k==507 为条件(当您希望 fread 成功时,这将停止它)。

  3. 当程序遇到断点时,检查变量并检查将要传递给 fread 的内容。第一次或两次你打断点,值会很好。

  4. 然后在第 509 次,您可能会看到传递给 fread 的虚假值。找出这些虚假值的来源——可能在被设置为任何虚假值的变量上设置一个条件断点。

于 2011-03-24T12:56:28.473 回答