读取 .bmp 文件头
reading .bmp file header
我正在尝试读取 .bmp 文件。我成功读取了初始的 B 和 M 字符,但之后我只得到 0,如果写入整数或空白,如果写入字符。
根据 https://en.wikipedia.org/wiki/BMP_file_format 应该有文件的大小,一些保留的字节和我的文件的偏移量。
int main(){
std::ifstream file("bmp.bmp");
char token;
int num;
file >> token;
if(token != 'B')
std::cerr << "file is not a .bmp";
file >> token;
if(token != 'M')
std::cerr << "file is not a .bmp";
for(int i = 0; i < 3; i++){
file >> num;
std::cout << num << "\n;
}
file.close
}
所有这些代码将打印在控制台上是:
0
0
0
为什么我没有得到预期的输出?
您需要进行二进制读取(而不是像您现在所做的那样读取文本)
std::ifstream file("bmp.bmp", std::ios_base::binary);
file.read((char*)&num, sizeof num);
其中 num
以正确的大小声明(int32_t
或 int16_t
)。
此外,您可能需要更正 endianess 的数字。
我建议在进一步学习之前先阅读 C++ 中的二进制 I/O。
我正在尝试读取 .bmp 文件。我成功读取了初始的 B 和 M 字符,但之后我只得到 0,如果写入整数或空白,如果写入字符。 根据 https://en.wikipedia.org/wiki/BMP_file_format 应该有文件的大小,一些保留的字节和我的文件的偏移量。
int main(){
std::ifstream file("bmp.bmp");
char token;
int num;
file >> token;
if(token != 'B')
std::cerr << "file is not a .bmp";
file >> token;
if(token != 'M')
std::cerr << "file is not a .bmp";
for(int i = 0; i < 3; i++){
file >> num;
std::cout << num << "\n;
}
file.close
}
所有这些代码将打印在控制台上是:
0
0
0
为什么我没有得到预期的输出?
您需要进行二进制读取(而不是像您现在所做的那样读取文本)
std::ifstream file("bmp.bmp", std::ios_base::binary);
file.read((char*)&num, sizeof num);
其中 num
以正确的大小声明(int32_t
或 int16_t
)。
此外,您可能需要更正 endianess 的数字。
我建议在进一步学习之前先阅读 C++ 中的二进制 I/O。