C语言文件操作问题
我的问题有点长,请耐心,谢谢给出源程序:
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
unsigned char buff[4];
char data[256];
FILE *rfp,*wfp;
unsigned long width;
unsigned long height;
unsigned long bitdata;
unsigned char tbuff[4];
BITMAPINFOHEADER lpBi;
unsigned char *image;
unsigned int i;
if((rfp = fopen(argv[1],"rb")) == NULL){
perror(0);
exit(0);
}
if((wfp = fopen(argv[2],"wb")) == NULL){
perror(0);
exit(0);
}
fgets(data,256,rfp);
width = (unsigned int)strtol(data,NULL,10);
fgets(data,256,rfp);
height = (unsigned int)strtol(data,NULL,10);
image = (unsigned char *)malloc(height*width*3);
// 写一些头信息
tbuff[0] = 'B';
tbuff[1] = 'M';
fwrite(tbuff,2,1,wfp);
tbuff[3] = ((14 +40 +width * height * 3) >> 24) & 0xff;
tbuff[2] = ((14 +40 +width * height * 3) >> 16) & 0xff;
tbuff[1] = ((14 +40 +width * height * 3) >> 8) & 0xff;
tbuff[0] = ((14 +40 +width * height * 3) >> 0) & 0xff;
fwrite(tbuff,4,1,wfp);
tbuff[1] = 0;
tbuff[0] = 0;
fwrite(tbuff,2,1,wfp);
fwrite(tbuff,2,1,wfp);
tbuff[3] = 0;
tbuff[2] = 0;
tbuff[1] = 0;
tbuff[0] = 54;
fwrite(tbuff,4,1,wfp);
// 写bmp的一些头信息
lpBi.biSize = 40;
lpBi.biWidth = width;
lpBi.biHeight = height;
lpBi.biPlanes = 1;
lpBi.biBitCount = 3*8;
lpBi.biCompression = 0;
lpBi.biSizeImage = width*height*3;
lpBi.biXPelsPerMeter = 300;
lpBi.biYPelsPerMeter = 300;
lpBi.biClrUsed = 0;
lpBi.biClrImportant = 0;
fwrite(&lpBi,1,40,wfp);
i = 0;
while(!feof(rfp)){
if(i>=width*height) break;
fgets(data,256,rfp);
bitdata=strtol(data,NULL,16);
image[((height-i/width-1)*width*3)+(i%width)*3+0] = (bitdata >> 0) & 0xff;
image[((height-i/width-1)*width*3)+(i%width)*3+1] = (bitdata >> 8) & 0xff;
image[((height-i/width-1)*width*3)+(i%width)*3+2] = (bitdata >> 16) & 0xff;
i++;
}
fwrite(image,1,width*height*3,wfp);
fclose(rfp);
fclose(wfp);
free(image);
return 0;
}
功能:程序的目的是要把一个字符串的文本文件转换成二进制文件
原文件格式:(后面的注释是方便大家理解我加的)
1920 //这2个数是计算image大小用的
1080
22292d //往下都是这样数字组成的字符串,一共1920x1080行,每行后都有换行符,我要把它转为16进制数,然后存到232a2e //image数组里面,最后写道wfp里面,存的时候这6个数字分成3个16进制数,所以image=width*height*3
232a2e
232a2e
242b2f
252c30
252c30
252c30
252c30
252c30
252c30
252c30
问题:编译运行后的结果不正确,生成的文件里面的数字和我想要的对不上,而且大小也小好多,前面的头信息都不正确;
但是如果我把后面的while循环以及后面的fwrite(image,1,width*height*3,wfp)删掉后,头信息就可以正确的写入了,搞了几天不得其解,望赐教,谢谢
可以在这回复,QQ联系也行:348351469,那样我可以把文件传给你看看