在C语言中读取bmp头文件

在C语言中读取bmp头文件,c,bmp,C,Bmp,我写了一个程序来读取BMP文件头。 代码如下: #include <stdio.h> typedef unsigned short WORD; typedef unsigned short BYTE; typedef unsigned int DWORD; typedef struct _WinBMPFileHeader { WORD FileType; DWORD FileSize; WORD Reserved1; WORD Reserved2;

我写了一个程序来读取BMP文件头。 代码如下:

#include <stdio.h>

typedef unsigned short WORD;
typedef unsigned short BYTE;
typedef unsigned int DWORD;

typedef struct _WinBMPFileHeader {
  WORD   FileType;
  DWORD  FileSize;
  WORD   Reserved1;
  WORD   Reserved2;
  DWORD  BitmapOffset;
} WINBMPFILEHEADER;

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

  WINBMPFILEHEADER *header = NULL;
  FILE *fptr;
  size_t bytes_read;

  if (argc == 2) {
    fptr = fopen(argv[1], "r");
    bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr);
  }
  else
    printf("The number of parameters is wrong.\n");

  return 0;

}
#包括
typedef无符号短字;
typedef无符号短字节;
typedef无符号整数双字;
类型定义结构\u WinBMPFileHeader{
字文件类型;
DWORD文件大小;
保留字1;
保留字2;
DWORD位图偏移量;
}WINBMPFILEHEADER;
int main(int argc,char*argv[]){
WINBMPFILEHEADER*header=NULL;
文件*fptr;
读取的字节大小;
如果(argc==2){
fptr=fopen(argv[1],“r”);
bytes_read=fread(头,sizeof(WINBMPFILEHEADER),1,fptr);
}
其他的
printf(“参数数量错误。\n”);
返回0;
}
当我运行程序时,由于fread,我有一个分段错误。 这个故障的原因是什么?

看看这个

WINBMPFILEHEADER *header = NULL;
...
bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr);
分段错误是因为您正在向函数传递
NULL
。您可能必须为
标题
分配内存

header = malloc (sizeof(WINBMPFILEHEADER));
另外,您还有一个声明错误作为单独的问题:

typedef unsigned short BYTE;
应该是

typedef unsigned char BYTE;
最后,您必须确保没有任何2或4字节字段(我认为没有任何8字节字段)的endian问题,这有点离题。

看看这个

WINBMPFILEHEADER *header = NULL;
...
bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr);
分段错误是因为您正在向函数传递
NULL
。您可能必须为
标题
分配内存

header = malloc (sizeof(WINBMPFILEHEADER));
另外,您还有一个声明错误作为单独的问题:

typedef unsigned short BYTE;
应该是

typedef unsigned char BYTE;

最后,您必须确保任何2或4字节字段(我不认为有任何8字节字段)都没有问题。

试试这个,我使用的是sipmle

synHead reader(FILE* img) { 
synHead info;
fseek(img, 10, 0);
fread(&info.D, 1, 4, img);

fseek(img, 18, 0);
fread(&info.W, 1, 4, img);

fseek(img, 22, 0);
fread(&info.H, 1, 4, img);

return(info);

试试这个,这是我用的一个

synHead reader(FILE* img) { 
synHead info;
fseek(img, 10, 0);
fread(&info.D, 1, 4, img);

fseek(img, 18, 0);
fread(&info.W, 1, 4, img);

fseek(img, 22, 0);
fread(&info.H, 1, 4, img);

return(info);

您只需假设文件已正确打开。永远不要假设有了外部资源就成功了。如果fopen()失败,则返回null。如果您随后尝试使用该空值作为文件指针,则会出现分段错误。
fread
读取二进制流,但您的
fopen
会显示
'r'
而不是
'rb'
。此外,您在尝试打开文件后不会检查错误,因此您如何知道该文件实际上已成功打开并准备好读取?可能与此类似:我知道程序在这一点上失败,因为我使用printf进行了检查,但为了节省空间,我省略了它们。此外,gdb还告诉我们问题出在fread。最后,我尝试使用fopen(argv[1],“rb”),但再次失败。您只需假设文件已正确打开。永远不要假设有了外部资源就成功了。如果fopen()失败,则返回null。如果您随后尝试使用该空值作为文件指针,则会出现分段错误。
fread
读取二进制流,但您的
fopen
会显示
'r'
而不是
'rb'
。此外,您在尝试打开文件后不会检查错误,因此您如何知道该文件实际上已成功打开并准备好读取?可能与此类似:我知道程序在这一点上失败,因为我使用printf进行了检查,但为了节省空间,我省略了它们。此外,gdb还告诉我们问题出在fread。最后,我尝试使用fopen(argv[1],“rb”),但再次失败。谢谢,现在它可以工作了。我对声明有一个问题。为什么“typedef unsigned short BYTE;”是正确的声明?如果这个答案是正确的,请“接受”它。至于你的评论问题,这是一个“打字错误”或“抄袭/通心粉”错误。为什么要将两种类型定义为相同的类型?查看上面的单词
typedef
。字节永远不会是
短的
。我想你的意思是“为什么
typedef没有符号的短字节;
声明错误?”谢谢,现在它可以工作了。我对声明有一个问题。为什么“typedef unsigned short BYTE;”是正确的声明?如果这个答案是正确的,请“接受”它。至于你的评论问题,这是一个“打字错误”或“抄袭/通心粉”错误。为什么要将两种类型定义为相同的类型?查看上面的单词
typedef
。字节永远不会是
短的
。我想你的意思是“为什么
typedef是无符号的短字节;
是错误的声明?”