c++ - 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.
解决方案
我相信问题的根源在于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);
推荐阅读
- android - 使用数据库+网络进行分页
- ios - 如何安装以前版本的 ios 应用程序?
- clojure - 为什么我无法在 Clojure 中加载文件?
- excel - Put in one field, values from other fields in one row with some extra text EXCEL
- java - 有没有更好的方法来获取由 lambdas 函数创建的 List 的最大值索引
- php - Referencing field from stdClass Object which contains an array of drawable information
- python-3.x - 如何在 Python 中做一个 nack
- c - 如何复制在C中双重排序的链表
- jackson - How to serialize Timestamp into Json field in NiFi ValidateRecord processor / JsonRecordSetWriter
- c# - 有没有办法让我的程序向手机发送短信?