Я пытаюсь прочитать растровое изображение из двоичного файла. Я подтвердил, что байты правильно записываются в двоичный файл. Теперь я пытаюсь открыть этот двоичный файл, прочитать байты, извлечь биты из этих байтов и сохранить их в массиве. Битовый набор работает для первого байта, но не работает для всех последующих байтов.
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.
Мы понятия не имеем, что находится в том файле, который вы читаете. Как насчет того, чтобы пропустить чтение файла ради этого вопроса и просто жестко закодировать значения в каком-то массиве, чтобы убедиться, что битовый набор «не работает должным образом».
А в чем ценность sb.block_size
? Как далеко в файл вы ищете?
Похоже, он должен работать нормально (по крайней мере, материал bitset
)
Почему после считывания c
не выводится? Вы выводите все остальное, кроме самого важного аспекта проблемы.
что такое sb.block_size
и что такое «бит на пиксель» для файла растрового изображения? Обратите внимание, что в растровых изображениях с высоким содержанием цвета для хранения цвета используются байты.
Я считаю, что проблема кроется в отказе 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);
Так что я почти уверен, что вы используете C++ из-за класса и строки; и cout. Но тогда что это за шутка?