C fread()中的Segfault
我正在尝试用C读取BMP图像(灰度标尺),将值保存到数组中,并将该数组转换为一个字符串,其中的值用逗号分隔 我的程序在64位Windows 7下运行良好,但由于库兼容性问题,我不得不改用32位Windows XP 我有1750个图像要读,我想把它们全部存储在一个字符串中 当我启动我的程序时,它会一直正常运行,直到第509张图像,然后我得到一个由fread()引起的分割错误。这是我的密码:C fread()中的Segfault,c,segmentation-fault,fread,C,Segmentation Fault,Fread,我正在尝试用C读取BMP图像(灰度标尺),将值保存到数组中,并将该数组转换为一个字符串,其中的值用逗号分隔 我的程序在64位Windows 7下运行良好,但由于库兼容性问题,我不得不改用32位Windows XP 我有1750个图像要读,我想把它们全部存储在一个字符串中 当我启动我的程序时,它会一直正常运行,直到第509张图像,然后我得到一个由fread()引起的分割错误。这是我的密码: int i=0,j,k,num,len,length,l; unsigned char *Buffer; F
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);
}
inti=0,j,k,num,len,length,l;
无符号字符*缓冲区;
文件*fp;
char*string,*finalstring;
字符*查询;
char-tmp2[5],tmp[3];
查询=(char*)malloc(sizeof(char)*200000000);
字符串=(char*)malloc(sizeof(char)*101376);
缓冲区=(无符号字符*)malloc(sizeof(无符号字符)*26368);
BITMAPFILEHEADER bMapFileHeader;
BitMapInfo标头bmapInfo标头;
长度=0;
对于(k=1;k您从何处获得101376
?每个字节最多占用5个字符作为带逗号的十进制数字(例如-127,
),5*26368
是131840
使其成为tmp[4];
表示三位数字,终止为0。
另外:fclose
在哪里?我怀疑您的文件句柄用完了。
检查fp!=0
是否清除malloc
调用中的强制转换。以及#包括
在您使用的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;
}
#包括
内部主(空){
printf(“sizeof(int)是%d\n”,(int)(sizeof(int));
printf(“sizeof(int*)是%d\n”,(int)(sizeof(int*));
返回0;
}
在调试器中运行程序
在调用时设置断点
fread——使其有条件于
k==507(当您
期待fread的成功)
当程序点击
断点,检查变量
并检查将要通过的内容
给弗瑞德,头一两次
当你碰到断点时,这些值
那就好了
那么在第509次,你会
可能会看到传递了假值
去弗瑞德,看看那些东西在哪里
虚假价值来自于--
可能设置一个条件
正在设置的变量上的断点
不管虚假价值是什么
非常感谢,它实际上解决了我的问题,我不知道文件句柄用完了,我以为每次打开图像时都会初始化fp。在k循环结束时添加fclose(fp)解决了我的问题:)