在C语言中读取bmp头文件
我写了一个程序来读取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;
#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是无符号的短字节;
是错误的声明?”