在C内存中读取和写入BMP文件错误

时间:2016-10-02 06:07:47

标签: c memory memory-leaks out-of-memory fread

我正在尝试编写一个程序来反转图像的颜色。我的问题是当我尝试从BMP文件中的DIB头读取时。

当我尝试获取文件头大小并使用fread(dib.fileheader,4,1,fp)时; 。我收到一条错误,上面写着“内存无法写入”。我附上了它以进一步澄清。

enter image description here

这是我的代码:

#include <stdio.h>
#include <string.h>


 struct BMP {
char filetype[2]; // must be BM, must check if BM
unsigned int filesize;
short        reserved1;
short        reserved2;
unsigned int dataoffset;

};

    struct DIB {
unsigned int  fileheader;
unsigned int headersize;
int          width;
int          height;
short        planes;
short        bitsperpixel;  /* we only support the value 24 here */
unsigned int compression;   /* we do not support compression */
unsigned int bitmapsize;
int          horizontalres;
int          verticalres;
unsigned int numcolors;
unsigned int importantcolors
  };
    struct pixel {
int val;
char * def;
struct listitem * next;
  };


 void invertImage(char fileName[]){

  struct BMP bmp;
  struct DIB dib;


     FILE *fp = fopen(fileName, "rb");

//FileType
 fread(bmp.filetype, 1,2,fp);
  printf("Value is %c\n", bmp.filetype[1]);

   //Check if file format is BM
  if(bmp.filetype[0] != 'B' && bmp.filetype[1] !='M'){
   printf("Wrong format");
  }
    //Size of the file in bytes
    fread(bmp.filesize, 4,1,fp);
    printf("Value is %d\n", bmp.filesize);
    //Go to dataoffset
    fseek(fp,10,SEEK_CUR);

    fread(bmp.dataoffset, 4,1,fp);
    printf("Offset is %d\n", bmp.dataoffset);


    fread(dib.fileheader, 4,1,fp);
    printf("File header is %d bytes\n", dib.fileheader);


    fclose(fp);

    }

   int main(int argc, char *argv[] ){

   printf("Program name %s\n", argv[0]);


   if( strcmp(argv[1],"-invert") == 0) {
  printf("Invert\n");
  printf("File name is %s\n", argv[2] );

  invertImage(argv[2]);

  }

   else {
  printf("Greyscale\n");
  //greyScaleImage();
   }

  return 0;

    }

这也是我程序的输出。

enter image description here

2 个答案:

答案 0 :(得分:1)

fread需要一个指向内存的指针来写入文件内容。所以你需要给它dib.fileheader

的地址
fread( &dib.fileheader, sizeof(dib.fileheader),1,fp );
printf("File header is %d bytes\n", dib.fileheader);

它正在抱怨,因为它会将dib.fileheader中的任何内容解释为要写入的地址,这可能对您的程序有效,也可能无效。

请注意,以下内容正常,因为bmp.filetype已经是char的指针 - 它是一个char []

fread(bmp.filetype, 1,2,fp);
printf("Value is %c\n", bmp.filetype[1]);

为了使它更通用,你可以写

fread(bmp.filetype, sizeof(bmp.filetype), 1, fp);
printf("Value is %c\n", bmp.filetype[1]);

答案 1 :(得分:0)

我试图编译你的代码。您必须对代码进行一些更改。

fread(bmp.filesize, 4,1,fp);  --- > fread(&bmp.filesize, 4,1,fp);
fread(bmp.dataoffset, 4,1,fp); --- > fread(&bmp.dataoffset, 4,1,fp);
fread(dib.fileheader, 4,1,fp); --- > fread(&dib.fileheader, 4,1,fp);
declare the function : void invertImage(char fileName[]);