【问题标题】:reading a bmp header in C在 C 中读取 bmp 标头
【发布时间】:2015-11-23 21:38:57
【问题描述】:

我编写了一个程序来读取 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;

}

当我运行程序时,由于 fread 出现分段错误。 这个故障的原因是什么?

【问题讨论】:

  • 您只是假设文件已正确打开。永远不要假设外部资源会成功。如果 fopen() 失败,则返回 null。如果您随后尝试将该 null 用作文件指针,则会出现分段错误。
  • fread 读取二进制流,但您的 fopen 确实说 'r' 而不是 'rb'。另外,您在尝试打开文件后不检查错误,那么您如何知道文件实际上已成功打开并准备好读取?
  • 我知道程序在那时失败了,因为我检查了 printf 但我省略了它们只是为了节省空间。此外,gdb 还告诉您问题出在 fread 中。最后,我只是尝试使用 fopen(argv[1], "rb") 并再次失败。

标签: c bmp


【解决方案1】:

看看这个

WINBMPFILEHEADER *header = NULL;
...
bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr);

分段错误是因为您将NULL 传递给函数。你必须为header分配内存,也许

header = malloc (sizeof(WINBMPFILEHEADER));

您还有一个声明错误作为单独的问题:

typedef unsigned short BYTE;

应该是

typedef unsigned char BYTE;

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

【讨论】:

  • 谢谢,现在可以了。我对声明有疑问。为什么是“typedef unsigned short BYTE;”正确的声明?
  • 如果这个答案是正确的,请“接受”它。至于您的评论问题,这是一个“错字”或“复制/意大利面”错误。为什么要将两种类型定义为相同?查看上面的 WORD typedef。 BYTE 永远不会是short
  • 我想你的意思是“为什么typedef unsigned short BYTE; 错误声明?”
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2014-05-22
    • 2014-12-26
    • 1970-01-01
    • 2021-12-05
    • 2018-04-10
    • 1970-01-01
    相关资源
    最近更新 更多