Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用C+;读取位图文件的BITMAPFILEHEADER+;_C++_Bitmap - Fatal编程技术网

C++ 无法使用C+;读取位图文件的BITMAPFILEHEADER+;

C++ 无法使用C+;读取位图文件的BITMAPFILEHEADER+;,c++,bitmap,C++,Bitmap,我试图读取位图文件的FILEHEADER和INFOHEADER,但无法读取。我遇到分段错误 下面给出了我的代码 #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

我试图读取位图文件的FILEHEADER和INFOHEADER,但无法读取。我遇到
分段错误

下面给出了我的代码

#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;
}
#包括
使用名称空间std;
typedef int LONG;
typedef无符号短字;
typedef无符号整数双字;
结构BITMAPFILEHEADER{
字型;
德沃德尺寸;
保留字1;
保留字2;
德沃德;
};
结构BitMapInfo标头{
德沃德·比西泽;
长双宽;
长双峰高度;
单词双平面;
单词双比特计数;
德沃德双压缩;
德沃德·比西泽迈格;
长双峰渗透计;
长双渗透计;
德沃德·比克尔鲁斯;
德沃德·比克勒;
};
内部主(空){
ifstream文件(“lena.bmp”);
char*bf=NULL;
int begin=file.tellg();
seekg(0,ios::end);
int end=file.tellg();
int长度=结束-开始;
文件读取(bf,长度);
BITMAPFILEHEADER*文件头=(BITMAPFILEHEADER*)(bf);
//BitMapInfo头*信息头=(BitMapInfo头*)(bf+sizeof(BITMAPFILEHEADER)-1);

cout bfSize分段错误可能是因为您忘记初始化
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),因为文件指针位于文件的末尾,因此您实际上从未读取任何内容。

如前一个答复中所述,您尝试使用空指针读取
file.read
。 我看到您正在尝试将整个文件加载到内存中,然后执行一些指针算法来处理数据。但是为什么不直接读取
BITMAPFILEHEADER

ifstream file("lena.bmp");

// read in the header:
BITMAPFILEHEADER header;
file.read(reinterpret_cast<char *>(&header), sizeof(header));

// validate the header, get the size in bytes of the bitmap data
size_t bitmapSizeBytes = width * height * channels; // or something like that...

// Now read the bitmap. Use a vector to simplify memory management:
std::vector<unsigned char> bitmap;
bitmap.resize(bitmapSizeBytes);

file.read(reinterpret_cast<char *>(&bitmap[0]), bitmapSizeBytes);
ifstream文件(“lena.bmp”);
//在标题中阅读:
位图文件头;
read(reinterpret_cast(&header),sizeof(header));
//验证标头,获取位图数据的大小(以字节为单位)
size\u t bitmapSizeBytes=width*height*channels;//或者类似的东西。。。
//现在读取位图。使用矢量简化内存管理:
矢量位图;
bitmap.resize(位图大小字节);
read(重新解释转换(&bitmap[0]),bitmapSizeBytes);

包含出现在代码中的文件看起来非常草图。这包括所有的C和C++头文件。我确信这不是问题。我不认为是这样,但是它使代码在编译器之间完全不可移植,而且当我怀疑头被记录时,在位文件夹中,头的行为是PROB。能够在将来的任何更新中自由更改。好的,我会研究它。谢谢。但这不是现在的问题。我遇到分割错误。我无法找出我的错误。非常感谢。你太好了。它已删除了我的错误。但是你能帮我解决另一个问题吗。我每次都得到大小=0。你能帮我吗告诉我我做错了什么?是的,我注意到了同样的事情…我不熟悉这个结构,让我看看。非常感谢。我已经解决了,谢谢你。我编辑了答案,看看这是否解决了问题。我很抱歉,但是这些变量来自哪里,宽度*高度*通道。如果我听起来很愚蠢,我很抱歉,但我对所有这些都是新手ese.不,相反,我道歉。我编造了这些变量,因为我不太记得Windows.bmp文件的结构。这只是一个指导您的伪代码。图像通常是这样布置的,宽度乘以高度乘以颜色通道数。但我想说的是,您应该直接读取标题使用矢量,而不是原始字符*指针。