今天,在看代码的时候,遇到了读取位图格式信息时出现了一些问题,先讲一下几个函数:
1、文件打开函数:
在定义FILE * fp 之后,fopen的用法是: fp = fopen(filename,"w")。而对于fopen_s来说,还得定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,"w")。返回值的话,对于fopen来说,打开文件成功的话返回文件指针(赋值给fp),打开失败则返回NULL值;对于fopen_s来说,打开文件成功返回0,失败返回非0。这个程序我用的是fopen_s,如果用fopen 则会出现一个警告;
2、exit()退出函数:
C语言中exit()用法
fseek()函数用法
jenny 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://wyiceshark.blogbus.com/logs/5323034.html
调用形式:
fseek(文件类型指针fp,位移量,起始点); |
其中,“位移量”是long型数据,它表示位置指针相对于“起始点”移动的字节数。如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。
“起始点”不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:
起始点 |
对应的数字 | 代表的文件位置 |
SEEK_SET |
0 | 文件开头 |
SEEK_CUR |
1 | 文件当前位置 |
SEEK_END |
2 | 文件末尾 |
例如:
fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);
其作用是将位置指针移到离文件头50个字节处。
4、fread()函数用法:
先可以看看:http://www.fzs8.net/C_Function/2007-06-13/c_6099.html
然后结合:http://blog.163.com/niuyuanyuan_2008/blog/static/1280010472010393475851/中的C++中fread函数和fwrite函数的用法 具体如下:
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
4.例:
1.fread(&id,1,10,f)就是把f里面的值读到id里面,每次读1个字节,一共读10次,或者把id里面的值都读完,不到10次也会停止。
2.fwrite(&id,1,10,f)就是把id里面的值读到f里面,每次读1个字节,一共读10次或是fread(&id,10,1,f)就是把id里面的值读到里面,每次读10个字节,一共读1次。
自己编译程序用vs2008读取位图信息如下:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int width = 0, height = 0,i,j,num[3],skip=0,fpskip;
char *raw=NULL;
short int bitwidth=0;
char R,G,B,alp;
FILE *fp = NULL;
errno_t err = fopen_s( &fp,"d:\\125.bmp", "rb" );
if(!fp) exit(2);
fseek(fp,10L,0);//把fp指针移动到离文件开头10字节处
fread(&skip,4,1,fp);
fseek(fp,18L,0);
fread(num,4,2,fp);
width=num[0];
height=num[1];
fseek(fp,28,0);
fread(&bitwidth,2,1,fp);
if(0==width%4)
fpskip=0;
else
fpskip=4-width%4;
printf("width=%d,height=%d,skip=%d,fpskip=%d\n",num[0],num[1],skip,fpskip);
raw = (char*)malloc((width) * (height));
fseek(fp,skip,0);
if(24==bitwidth)
{
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
B=fgetc(fp);
G=fgetc(fp);
R=fgetc(fp);
raw[width*(height-i-1)+j]=(299*R+587*G+114*B)/1000;
}
fseek(fp,fpskip,1);
}
}
if(32==bitwidth){
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
B=fgetc(fp);
G=fgetc(fp);
R=fgetc(fp);
alp=fgetc(fp);
raw[width*(height-i-1)+j]=(299*R+587*G+114*B)/1000;
}
fseek(fp,fpskip,1);
}
}
fclose(fp);/* clean up */
getchar();
return 0;
}
结果如下:
在编译程序时,由于自己把.png格式的图片重命名为.bmp,因此直接导致提取位图信息错误,因此,以后希望自己在今后更仔细,加油!