首页 > 解决方案 > Bitset 未正确提取位

问题描述

我正在尝试从二进制文件中读取位图。我确认字节被正确写入二进制文件。我现在正试图打开那个二进制文件,读取字节,从这些字节中提取位,并将它们存储在一个数组中。Bitset 适用于第一个字节,但不适用于所有后续字节。

void loader::load_inode_map(string filename){
    FILE *fp = fopen(filename.c_str(), "rb+");
    fseek(fp, sb.block_size, SEEK_SET);
    bitset<8> bit;
    char c;

    int count = 0;
    for(int i = 0; i < 32; i++){
        fread(&c, 1, 1, fp);
        bit = c;
        cout << "---new byte---" << endl;
        for (int j = 7; j >= 0; j--){
            cout << bit[j] << endl;
            inode_map[count] = bit[j];
            count++;
        }
    }
    fclose(fp);
}

为了测试这个函数的功能,我将所有位都设置为 1。这打印出第一个字节,但后面的所有字节都只打印出 0。我做错了什么?

Output:
---new byte---
1
1
1
1
1
1
1
1
---new byte---
0
0
0
0
0
0
0
0
---new byte---
0
0
0
0
0
0
0
0
...and so on.

标签: c++bitmapfile-read

解决方案


我相信问题的根源在于fread失败。

尝试检查它的返回值:

if (fread(&c, 1, 1, fp) != 1) { /* error! */ }

你也应该考虑使用std::ifstream,否则你很容易泄漏资源。

以下是您需要的方法:

std::ifstream file(filename, std::ios::binary);
file.seekg(sb.block_size);
if (!file.good()) { /* error! */ }
file.read(&c, 1);

推荐阅读