| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 408 人关注过本帖
标题:C语言文件操作问题
只看楼主 加入收藏
mayjpch
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-8-16
收藏
 问题点数:0 回复次数:0 
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,那样我可以把文件传给你看看
搜索更多相关主题的帖子: 文件 fread feof strtol 
2009-08-16 23:36
快速回复:C语言文件操作问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015671 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved