无法使用C ++读取位图文件的BITMAPFILEHEADER [英] Cannot read BITMAPFILEHEADER of a bitmap file using C++

查看:110
本文介绍了无法使用C ++读取位图文件的BITMAPFILEHEADER的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试读取位图文件的FILEHEADER和INFOHEADER,但是我无法读取.我正在获取Segmentation Fault.

I am trying to read the FILEHEADER and INFOHEADER of a bitmap file, but I am unable to do so. I am getting Segmentation Fault.

下面给出了我的代码.

#include <bits/stdc++.h>

using namespace std;

typedef int LONG;
typedef unsigned short WORD;
typedef unsigned int DWORD;

struct BITMAPFILEHEADER {
  WORD  bfType;
  DWORD bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD bfOffBits;
};

struct BITMAPINFOHEADER {
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount;
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
};

int main(void){
    ifstream file("lena.bmp");
    char* bf = NULL;
    int begin = file.tellg();
    file.seekg(0, ios::end);
    int end = file.tellg();
    int length = end-begin;

    file.read(bf, length);
    BITMAPFILEHEADER* file_header = (BITMAPFILEHEADER*)(bf);
    //BITMAPINFOHEADER* info_header = (BITMAPINFOHEADER*)(bf+sizeof(BITMAPFILEHEADER)-1);

    cout << file_header->bfSize << endl;
    //cout << info_header->biSize << endl;
    return 0;
}

推荐答案

分段错误可能是因为您忘记初始化bf;

The segmentation fault is probably because you forgot to initialize bf;

int end = file.tellg();
int length = end-begin;
bf = new char[lenght+1]; //Add this
file.seekg(0, ios::beg); //And this too
file.read(bf, length);

出现第二个问题(大小始终为0),因为文件指针位于文件的末尾,因此您实际上从不读取任何内容.

The second problem (size is always 0) occurs because the file pointer is at the end of the file, so you never read anything actually.

这篇关于无法使用C ++读取位图文件的BITMAPFILEHEADER的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆